Compare commits

...

9 Commits

@ -1,6 +1,6 @@
include ':app'
include ':vital-sign-engine'
project(':vital-sign-engine').projectDir = new File('C:\\Users\\taha.alam\\AndroidStudioProjects\\diplomatic-quarter\\packages\\vital_sign_camera\\android\\libs')
project(':vital-sign-engine').projectDir = new File('../packages/vital_sign_camera/android/libs')
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()

Binary file not shown.

After

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Capa_1" version="1.1" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116) -->
<defs>
<style>
.st0 {
fill: #d12127;
}
</style>
</defs>
<path class="st0"
d="M8.5,119.5c2.3,0,4.4-.9,6-2.5s2.5-3.8,2.5-6V25.6c0-4.7,3.8-8.5,8.5-8.5h85.3c4.7,0,8.5-3.8,8.5-8.5s-3.8-8.5-8.5-8.5H25.6C11.5,0,0,11.5,0,25.6v85.3c0,2.3.9,4.4,2.5,6,1.6,1.6,3.8,2.5,6,2.5Z" />
<path class="st0"
d="M486.4,0h-85.3c-4.7,0-8.5,3.8-8.5,8.5s3.8,8.5,8.5,8.5h85.3c4.7,0,8.5,3.8,8.5,8.5v85.3c0,4.7,3.8,8.5,8.5,8.5s8.5-3.8,8.5-8.5V25.6c0-14.1-11.5-25.6-25.6-25.6Z" />
<path class="st0"
d="M503.5,392.5c-2.3,0-4.4.9-6,2.5-1.6,1.6-2.5,3.8-2.5,6v85.3c0,4.7-3.8,8.5-8.5,8.5h-85.3c-4.7,0-8.5,3.8-8.5,8.5s3.8,8.5,8.5,8.5h85.3c14.1,0,25.6-11.5,25.6-25.6v-85.3c0-2.3-.9-4.4-2.5-6-1.6-1.6-3.8-2.5-6-2.5Z" />
<path class="st0"
d="M110.9,494.9H25.6c-4.7,0-8.5-3.8-8.5-8.5v-85.3c0-4.7-3.8-8.5-8.5-8.5s-8.5,3.8-8.5,8.5v85.3c0,14.1,11.5,25.6,25.6,25.6h85.3c4.7,0,8.5-3.8,8.5-8.5s-3.8-8.5-8.5-8.5Z" />
<path
d="M503.5,162.1h-86.4c-.5-16.5-4-32.7-10.1-48-17.5-35.6-69.2-88.5-139.6-88.5h-22.7c-70.5,0-122.1,52.9-139.6,88.5-6.1,15.3-9.6,31.6-10.1,48H8.5c-4.7,0-8.5,3.8-8.5,8.5s3.8,8.5,8.5,8.5h85.5c-.2,6.3-.2,12.4-.2,18.4-1.6-.5-3.1-.9-4.8-1.1-8.2-1-16.4,1.8-22.1,7.7-6.7,8.6-9.1,19.8-6.5,30.4,2.2,11.5,5.4,22.7,9.6,33.6l1.4,4.2c1,2.9,1.9,6,2.7,9.1,1.9,8.6,5.2,16.7,9.9,24.1,3.7,5.7,9.8,9.4,16.6,10.1.4,0,.8,0,1.3,0s.8,0,1.2-.1c.6,7.8.9,14.8.9,19.9,0,29.2,27.5,64.9,43.7,81.4,9.4,9.1,19.2,17.7,29.5,25.7,9.8,7.7,19.2,15.8,28.2,24.5,10.1,11.2,24.1,18,39.1,19.3h22.7c15-1.2,29-8.1,39.1-19.3,9-8.6,18.4-16.8,28.2-24.5,10.3-8.1,20.2-16.6,29.6-25.8,16.2-16.5,43.7-52.2,43.7-81.3s.4-12.1.9-19.9c.4,0,.8.1,1.2.1s.9,0,1.3,0c6.8-.7,12.8-4.4,16.6-10.1,4.7-7.4,8-15.5,9.9-24.1.9-3.1,1.7-6.2,2.7-9.1l1.5-4.2c4.1-10.9,7.4-22.1,9.6-33.6,2.6-10.6.3-21.8-6.5-30.4-5.7-5.9-13.9-8.7-22.1-7.7-1.6.2-3.2.6-4.7,1.1,0-5.9,0-12.1-.2-18.4h85.5c4.7,0,8.5-3.8,8.5-8.5s-3.8-8.5-8.5-8.5ZM98.1,295.6c-3.4-5.8-5.9-12.1-7.3-18.7-1-3.5-1.9-6.9-3.1-10.1l-1.5-4.2c-3.8-10-6.8-20.3-8.9-30.9-1.5-5.2-.9-10.7,1.7-15.4,2.1-2.2,5.1-3.2,8.1-2.9,2.7.4,5.2,1.6,7.1,3.4.6,15.3,1.5,26.3,1.7,27.7,0,.4,3.4,28.1,5.8,54.1-1.6-.5-2.9-1.6-3.7-3ZM111.6,210.9c-.1-.2-.3-.3-.4-.5-.3-9.8-.3-20.6,0-31.3h16.8v27.8l-16.4,4.1s0-.1,0-.1ZM136.5,375.3c-8.5-11.7-13.8-25.4-15.3-39.7,0-7.9-.8-19.7-1.9-32.3,0-.5,0-1-.1-1.5-1.8-20.5-4.3-42.5-5.6-52.9l22.8,27.4v99.1ZM117.8,227.1l19.2-4.8,60.4,7.5,5.8,34.7h-54.2l-31.2-37.4ZM145.1,206.1v-26.9h28.8l16.2,32.5-45-5.6ZM193,179.2h42.5l-28.3,28.5-14.2-28.5ZM153.6,291.9l48.2,42.1-18.3,24.4h-29.9v-66.5ZM165.3,409.9c-1.8-1.7-3.6-3.4-5.3-5-2-2.1-4.2-4.4-6.4-7v-22.5h29.9l16.2,21.6-34.4,12.9ZM217.8,455.1c-9.4-9.1-19.3-17.7-29.6-25.8-2.7-2.2-5.5-4.5-8.2-6.7l29.5-11,31.8,57.2c-9-2.1-17.2-6.9-23.5-13.7ZM247.5,444.9l-19.6-35.3h19.6v35.3ZM247.5,392.5h-29.9l-19.2-25.6,19.2-25.6h29.9v51.2ZM247.5,324.3h-30.9l-48.8-42.7h43.3l36.3,14.5v28.1h0ZM247.5,277.7l-26.5-10.6-7-42.1,33.5-33.7v86.4h0ZM112.1,162.1c.4-13.9,3.2-27.6,8.3-40.5,15-30.5,62.1-79,124.3-79h22.7c62.2,0,109.3,48.4,124.3,79,5,12.9,7.8,26.6,8.3,40.5H112.1ZM366.9,179.2v26.9l-45,5.6,16.2-32.5h28.8ZM264.5,324.3v-28.1l36.3-14.5h43.3l-48.8,42.7h-30.9ZM313.6,366.9l-19.2,25.6h-29.9v-51.2h29.9l19.2,25.6ZM264.5,277.7v-86.4l33.5,33.7-7,42.1-26.5,10.6ZM276.5,179.2h42.5l-14.2,28.5-28.3-28.5ZM264.5,444.9v-35.3h19.6l-19.6,35.3ZM323.8,429.4h0c-10.3,8.1-20.2,16.7-29.6,25.8-6.3,6.8-14.5,11.6-23.5,13.7l31.8-57.2,29.5,11c-2.7,2.2-5.5,4.5-8.2,6.7ZM358.4,398c-2.2,2.5-4.4,4.9-6.4,6.9-1.6,1.7-3.4,3.4-5.3,5l-34.4-12.9,16.2-21.6h29.9v22.5ZM358.4,358.4h-29.9l-18.3-24.4,48.2-42.1v66.5h0ZM362.9,264.5h-54.2l5.8-34.7,60.4-7.5,19.2,4.8-31.2,37.4ZM392.8,301.7c0,.5-.1,1-.1,1.5-1.1,12.6-1.9,24.4-1.9,32.3-1.5,14.4-6.8,28.1-15.3,39.7v-99.1l22.8-27.4c-1.3,10.6-3.8,32.5-5.6,52.9ZM400.8,210.5c-.1.2-.3.3-.4.5,0,0,0,.1,0,.1l-16.4-4.1v-27.8h16.8c.3,10.7.3,21.4,0,31.3ZM424.8,213.4h0c3-.4,6,.7,8.1,2.8,2.6,4.7,3.2,10.3,1.7,15.5-2.1,10.5-5,20.8-8.9,30.8l-1.5,4.2c-1.1,3.3-2.1,6.7-3,10.1-1.4,6.6-3.8,12.9-7.3,18.7-.8,1.4-2.2,2.5-3.8,3,2.4-26.1,5.8-53.8,5.9-54.4.1-1.3,1.1-12.2,1.6-27.4,2-1.8,4.4-3,7.1-3.4Z" />
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

@ -0,0 +1,23 @@
<svg height="31" viewBox="0 0 31 31" width="31" xmlns="http://www.w3.org/2000/svg">
<g id="route" transform="translate(0 0)">
<path d="M365.505,13.407a.908.908,0,0,0,1.641,0l3.284-6.914a4.544,4.544,0,1,0-8.209,0Zm.82-9.774a.908.908,0,1,1-.908.908A.908.908,0,0,1,366.326,3.633Z" data-name="Path 5246"
fill="#da4a54"
id="Path_5246" transform="translate(-339.874)" />
<circle cx="1.5" cy="1.5" data-name="Ellipse 225" fill="#2e303a" id="Ellipse_225"
r="1.5" transform="translate(16 24)" />
<path d="M176.087,206.357a2.27,2.27,0,0,1,0-4.541h9.366L184.59,200h-8.5a4.087,4.087,0,0,0,0,8.174h5.11a3.644,3.644,0,0,1,0-1.816Z" data-name="Path 5247"
fill="#2e303a"
id="Path_5247" transform="translate(-161.586 -187.891)" />
<circle cx="2" cy="2" data-name="Ellipse 226" fill="#2e303a" id="Ellipse_226"
r="2" transform="translate(21 17)" />
<path d="M351.059,305h-.206a3.644,3.644,0,0,1,0,1.816h.206a2.331,2.331,0,0,1,0,4.662H345.1a3.645,3.645,0,0,1,0,1.816h5.958a4.147,4.147,0,0,0,0-8.295Z" data-name="Path 5248"
fill="#2e303a"
id="Path_5248" transform="translate(-324.206 -286.533)" />
<path d="M167.02,412l.795,1.816h2.952a3.644,3.644,0,0,1,0-1.816Z" data-name="Path 5249"
fill="#2e303a"
id="Path_5249" transform="translate(-156.907 -387.055)" />
<path d="M5.982,322.476a.908.908,0,0,0-1.664,0L.08,332.164a.908.908,0,0,0,1.283,1.153l3.788-2.164,3.788,2.164a.908.908,0,0,0,1.283-1.153Z" data-name="Path 5250"
fill="#2e303a"
id="Path_5250" transform="translate(0 -302.44)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

@ -0,0 +1 @@
<svg id="Icon" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"><circle cx="30" cy="30" fill="#e3ebf0" r="29"/><path d="m19.41 19.41c-2.32 2.3-3.89 5.37-4.3 8.79-.13 1.02-.96 1.8-1.99 1.8h-6.03c-1.16 0-2.1-.99-2-2.15.52-6.03 3.19-11.47 7.24-15.52l1.67-.33 5 4z" fill="#54afa4"/><path d="m30 5 1 2v6l-1 2c-4.13 0-7.88 1.68-10.59 4.41l-7.08-7.08c4.53-4.53 10.78-7.33 17.67-7.33z" fill="#68cec5"/><path d="m47.67 12.33.322 1.671-4.992 4.999-2.4.41h-.01c-2.71-2.73-6.45-4.41-10.59-4.41v-10c6.89 0 13.14 2.8 17.67 7.33z" fill="#f9d84b"/><path d="m54.91 27.85c.1 1.16-.84 2.15-2 2.15h-6.03c-1.03 0-1.86-.78-1.99-1.8-.41-3.41-1.97-6.48-4.29-8.79l7.07-7.08c4.05 4.05 6.72 9.49 7.24 15.52z" fill="#f9536b"/><path d="m44.851 16.308c-2.578 3.935-7.307 10.699-12.38 15.772-1.42 1.42-3.831 1.242-4.99-.543-.846-1.284-.585-2.985.501-4.071 5.073-5.052 11.795-9.75 15.71-12.317.762-.511 1.66.397 1.159 1.159z" fill="#4d5c7a"/><g fill="#262626"><path d="m52.907 31c.842 0 1.652-.356 2.223-.979.563-.613.846-1.437.774-2.26-.52-6.072-3.192-11.804-7.527-16.139-4.916-4.916-11.442-7.623-18.377-7.623-13.385 0-24.764 10.437-25.904 23.76-.071.824.212 1.648.774 2.262.571.622 1.381.979 2.223.979h6.031c1.514 0 2.793-1.152 2.977-2.68.843-7.023 6.818-12.32 13.899-12.32 2.708 0 5.28.763 7.52 2.206-3.316 2.42-7.096 5.418-10.244 8.554-1.446 1.445-1.711 3.686-.633 5.321.705 1.088 1.837 1.788 3.105 1.922.149.016.299.023.447.023 1.115 0 2.183-.439 2.982-1.239 3.162-3.161 6.182-6.966 8.615-10.302 1.131 1.762 1.858 3.753 2.107 5.835.182 1.527 1.461 2.68 2.976 2.68h6.031zm-23.907-24.951v7.998c-3.642.227-6.984 1.666-9.583 3.957l-5.631-5.631c4.07-3.741 9.413-6.078 15.213-6.324zm-14.886 22.034c-.063.532-.48.918-.99.918h-6.031c-.283 0-.557-.12-.749-.33-.188-.205-.279-.468-.256-.739.466-5.437 2.784-10.349 6.287-14.142l5.637 5.637c-2.083 2.357-3.498 5.333-3.898 8.656zm16.886-14.041v-8.018c5.694.233 11.038 2.45 15.239 6.323l-1.715 1.715c-.465-.098-.958-.032-1.38.251-1.065.698-2.409 1.603-3.9 2.656-2.437-1.744-5.254-2.746-8.243-2.928zm.764 17.332c-.479.478-1.13.709-1.807.641-.675-.071-1.256-.434-1.641-1.026-.562-.854-.405-2.036.372-2.812 4.791-4.772 11.129-9.254 14.887-11.751-2.5 3.767-7.006 10.143-11.812 14.948zm14.123-3.29c-.317-2.644-1.303-5.16-2.852-7.329 1.05-1.489 1.953-2.831 2.651-3.896.279-.425.344-.916.249-1.379l1.704-1.704c3.593 3.905 5.822 8.885 6.273 14.157.023.271-.067.532-.256.737-.192.21-.466.33-.749.33h-6.031c-.51 0-.927-.385-.989-.917z"/><path d="m30 0c-6.367 0-12.448 1.969-17.587 5.693-.447.324-.547.949-.223 1.396s.948.548 1.396.223c4.795-3.476 10.471-5.312 16.413-5.312 15.439 0 28 12.561 28 28s-12.561 28-28 28-27.999-12.561-27.999-28c0-7.737 3.086-14.938 8.689-20.276.4-.381.416-1.014.034-1.413-.381-.402-1.015-.415-1.413-.034-6.003 5.718-9.31 13.433-9.31 21.723 0 16.542 13.458 30 30 30s30-13.458 30-30-13.458-30-30-30z"/><path d="m33 50c.553 0 1-.447 1-1v-10c0-.464-.319-.866-.771-.974-.45-.106-.917.111-1.124.526l-2.105 4.211-2.105-4.211c-.207-.415-.677-.632-1.124-.526-.451.107-.771.51-.771.974v10c0 .553.447 1 1 1s1-.447 1-1v-5.764l1.105 2.211c.34.678 1.449.678 1.789 0l1.105-2.211v5.764c0 .553.447 1 1 1z"/><path d="m44 40c.553 0 1-.447 1-1s-.447-1-1-1h-6c-.553 0-1 .447-1 1s.447 1 1 1h2v8h-2c-.553 0-1 .447-1 1s.447 1 1 1h6c.553 0 1-.447 1-1s-.447-1-1-1h-2v-8z"/><path d="m23 41.5c0-1.93-1.57-3.5-3.5-3.5h-3.5c-.553 0-1 .447-1 1v10c0 .553.447 1 1 1h3.5c1.93 0 3.5-1.57 3.5-3.5 0-.98-.407-1.864-1.058-2.5.651-.636 1.058-1.52 1.058-2.5zm-2 5c0 .827-.673 1.5-1.5 1.5h-2.5v-3h2.5c.827 0 1.5.673 1.5 1.5zm-4-3.5v-3h2.5c.827 0 1.5.673 1.5 1.5s-.673 1.5-1.5 1.5z"/></g></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.9 KiB

@ -0,0 +1 @@
<svg id="Layer_3" enable-background="new 0 0 64 64" height="512" viewBox="0 0 64 64" width="512" xmlns="http://www.w3.org/2000/svg"><g><path d="m62 22.04c0 2.92-.42 5.82-1.24 8.59-.82 2.78-2.04 5.43-3.63 7.89-4.02 6.22-9.57 11.29-16.12 14.74l-9.01 4.74-9.01-4.74c-6.55-3.45-12.1-8.52-16.12-14.74-.73-1.14-1.39-2.31-1.96-3.52h11.16l.93-1 6 13 5-18 4 6h9.55c.7 1.19 1.97 2 3.45 2 2.21 0 4-1.79 4-4s-1.79-4-4-4c-1.48 0-2.75.81-3.45 2h-7.55l-7-12-5 17-5-10-3.07 5h-10.57c-.05-.12-.08-.25-.12-.37-.82-2.77-1.24-5.67-1.24-8.59 0-2.66.62-5.28 1.81-7.65 1.29-2.57 3.24-4.67 5.59-6.12 2.36-1.46 5.1-2.27 7.98-2.27 3.18 0 6.2 1 8.7 2.74 2.49 1.75 4.46 4.25 5.55 7.25l.37 1.01.37-1.01c1.09-3 3.06-5.5 5.55-7.25 2.5-1.74 5.52-2.74 8.7-2.74 2.88 0 5.62.81 7.98 2.27 2.35 1.45 4.3 3.55 5.59 6.12 1.19 2.37 1.81 4.99 1.81 7.65z" fill="#ea3647"/><path d="m54.6 8.27c-2.36-1.46-5.1-2.27-7.98-2.27-3.18 0-6.2 1-8.7 2.74-2.49 1.75-4.46 4.25-5.55 7.25l-.37 1.01-.37-1.01c-1.09-3-3.06-5.5-5.55-7.25-2.5-1.74-5.52-2.74-8.7-2.74-.041 0-.081.004-.122.004-1.452 3.72-2.258 7.762-2.258 11.996 0 3.177.452 6.249 1.29 9.156l.71-1.156 5 10 5-17 7 12h7.55c.7-1.19 1.97-2 3.45-2 2.21 0 4 1.79 4 4s-1.79 4-4 4c-1.48 0-2.75-.81-3.45-2h-9.55l-4-6-3.404 12.255c5.315 5.347 12.449 8.885 20.397 9.603 4.822-3.246 8.962-7.425 12.137-12.338 1.59-2.46 2.81-5.11 3.63-7.89.82-2.77 1.24-5.67 1.24-8.59 0-2.66-.62-5.28-1.81-7.65-1.29-2.57-3.24-4.67-5.59-6.12z" fill="#fd505b"/><path d="m44.941 11.534c.574-2.063 6.032-2.742 10.097 1.296s3.39 9.503 1.284 10.087-4.416-2.006-6.887-4.505c-2.47-2.5-5.068-4.815-4.494-6.878z" fill="#ff9aa5"/><path d="m55.126 7.419c-2.558-1.582-5.499-2.419-8.506-2.419-3.321 0-6.527 1.01-9.275 2.922-2.323 1.633-4.15 3.811-5.345 6.354-1.195-2.545-3.022-4.723-5.349-6.356-2.744-1.91-5.95-2.92-9.271-2.92-3.007 0-5.948.837-8.505 2.419-2.544 1.569-4.604 3.825-5.959 6.522-1.254 2.497-1.916 5.298-1.916 8.099 0 3.018.431 6.003 1.292 8.906l.029.097c.034.116.07.234.118.347.157.37.52.61.921.61h10.57c.348 0 .67-.181.853-.477l2.128-3.467 4.195 8.391c.185.368.565.592.983.549.409-.036.755-.319.87-.714l4.346-14.774 5.831 9.996c.179.308.509.496.864.496h7.55c.354 0 .683-.188.862-.493.555-.944 1.523-1.507 2.588-1.507 1.654 0 3 1.346 3 3s-1.346 3-3 3c-1.065 0-2.033-.563-2.588-1.507-.18-.305-.508-.493-.862-.493h-9.015l-3.703-5.555c-.217-.325-.601-.499-.99-.433-.386.062-.7.343-.806.72l-4.271 15.374-4.857-10.525c-.14-.303-.421-.516-.751-.568-.321-.054-.663.062-.89.307l-.632.68h-10.725c-.343 0-.661.175-.845.465-.184.289-.206.651-.06.962.563 1.196 1.244 2.419 2.024 3.636 4.098 6.341 9.801 11.557 16.494 15.082l9.01 4.74c.147.077.307.115.467.115s.32-.038.466-.115l9.01-4.74c6.693-3.525 12.396-8.741 16.494-15.082 1.644-2.543 2.905-5.285 3.749-8.148.85-2.872 1.281-5.857 1.281-8.875 0-2.801-.662-5.602-1.916-8.099-1.355-2.697-3.415-4.953-5.958-6.522zm4.675 22.929c-.79 2.68-1.972 5.247-3.511 7.629-3.911 6.054-9.356 11.032-15.746 14.398l-8.544 4.495-8.544-4.495c-6.39-3.366-11.835-8.345-15.744-14.396-.423-.66-.816-1.322-1.173-1.979h9.531c.236 0 .464-.084.644-.234l5.378 11.653c.176.38.556.608.989.578.418-.034.771-.325.883-.729l4.415-15.896 2.789 4.184c.186.277.498.444.832.444h9.017c.947 1.263 2.397 2 3.983 2 2.757 0 5-2.243 5-5s-2.243-5-5-5c-1.586 0-3.036.737-3.983 2h-6.442l-6.71-11.504c-.201-.345-.582-.54-.985-.489-.396.049-.726.328-.838.711l-4.283 14.562-3.863-7.727c-.162-.325-.488-.536-.851-.552-.364-.031-.706.166-.896.476l-2.779 4.523h-9.271c-.73-2.58-1.099-5.256-1.099-7.96 0-2.491.589-4.981 1.703-7.202 1.188-2.365 2.994-4.343 5.224-5.718 2.241-1.387 4.818-2.12 7.453-2.12 2.911 0 5.722.886 8.125 2.559 2.394 1.682 4.187 4.023 5.187 6.775l.37 1.01c.143.394.518.656.938.656s.795-.262.938-.656l.371-1.012c.999-2.75 2.792-5.092 5.182-6.771 2.407-1.675 5.218-2.561 8.129-2.561 2.635 0 5.212.733 7.454 2.12 2.229 1.375 4.035 3.353 5.223 5.718 1.114 2.221 1.703 4.711 1.703 7.202 0 2.825-.403 5.619-1.199 8.308z"/></g></svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.4 KiB

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve" width="512" height="512">
<g>
<g>
<path style="fill:#D77F4A;" d="M448.268,193.522c0-6.286-2.632-11.957-6.855-15.972c-2.615-2.486-3.009-6.596-0.766-9.422&#10;&#9;&#9;&#9;c2.985-3.76,4.768-8.516,4.768-13.69c0-7.532-3.779-14.18-9.545-18.154c-2.55-1.758-3.507-5.012-2.611-7.976&#10;&#9;&#9;&#9;c0.61-2.017,0.939-4.156,0.939-6.372c0-12.171-9.867-22.038-22.038-22.038c-0.271,0-0.071-6.017-0.74-9.253&#10;&#9;&#9;&#9;c-1.918-9.281-9.745-16.43-19.169-17.43c-1.211-0.128-2.405-0.159-3.575-0.098c-4.869,0.254-8.772-3.822-8.748-8.698&#10;&#9;&#9;&#9;c0-0.048,0-0.096,0-0.144c0-15.711-12.736-28.447-28.447-28.447c-0.174,0-5.572-18.923-21.496-16.566&#10;&#9;&#9;&#9;c-2.241,0.332-4.449,0.35-6.501,0.998c-4.71,1.488-9.938,0.436-13.691-2.776c-3.767-3.224-8.658-5.172-14.005-5.172&#10;&#9;&#9;&#9;c-4.18,0-8.08,1.19-11.383,3.249c-3.962,2.47-8.786,3.357-13.275,2.075c-1.881-0.537-3.868-0.825-5.922-0.825&#10;&#9;&#9;&#9;c-2.476,0-4.854,0.418-7.068,1.187c-4.807,1.67-10.112,0.693-14.313-2.179c-3.457-2.363-7.638-3.745-12.142-3.745&#10;&#9;&#9;&#9;c-4.802,0-9.235,1.571-12.817,4.225c-4.543,3.367-10.438,4.225-15.632,1.989c-2.968-1.278-6.239-1.986-9.676-1.986&#10;&#9;&#9;&#9;c-8.8,0-16.516,4.636-20.841,11.599c-2.887,4.648-7.74,7.748-13.208,7.944c-0.279,0.01-0.558,0.024-0.839,0.042&#10;&#9;&#9;&#9;c-14.402,0.942-26.008,12.822-26.575,27.244c-0.019,0.481-0.026,0.959-0.021,1.434c0.049,4.851-4.092,8.753-8.939,8.542&#10;&#9;&#9;&#9;c-1.105-0.048-2.231-0.015-3.372,0.105c-9.425,0.994-17.256,8.14-19.18,17.42c-0.672,3.24-0.472,9.263-0.743,9.263&#10;&#9;&#9;&#9;c-12.171,0-22.038,9.867-22.038,22.038c0,2.216,0.328,4.355,0.938,6.372c0.897,2.965-0.061,6.219-2.611,7.976&#10;&#9;&#9;&#9;c-5.765,3.974-9.545,10.622-9.545,18.154c0,5.174,1.783,9.93,4.768,13.69c2.243,2.826,1.849,6.936-0.766,9.422&#10;&#9;&#9;&#9;c-4.222,4.014-6.855,9.685-6.855,15.972c0,8.699,5.041,16.216,12.36,19.798c3.401,1.664,4.745,5.766,3.32,9.274&#10;&#9;&#9;&#9;c-1.279,3.149-1.851,6.66-1.517,10.338c0.922,10.154,8.945,18.467,19.054,19.791c2.827,0.37,5.555,0.183,8.114-0.439&#10;&#9;&#9;&#9;c-0.017,0.35-0.027,0.702-0.027,1.057c0,12.171,9.867,22.038,22.038,22.038c5.29,0,10.144-1.866,13.943-4.973&#10;&#9;&#9;&#9;c3.148,8.325,11.189,14.246,20.616,14.246c12.171,0,176.557,0,188.729,0c9.427,0,17.468-5.921,20.616-14.246&#10;&#9;&#9;&#9;c3.798,3.107,8.652,4.973,13.942,4.973c12.171,0,22.038-9.867,22.038-22.038c0-0.354-0.01-0.706-0.027-1.057&#10;&#9;&#9;&#9;c2.57,0.625,5.311,0.811,8.15,0.434c10.11-1.341,18.119-9.671,19.022-19.829c0.325-3.661-0.246-7.155-1.519-10.29&#10;&#9;&#9;&#9;c-1.425-3.51-0.084-7.614,3.318-9.279C443.227,209.738,448.268,202.22,448.268,193.522z"/>
<path style="fill:#FFD15B;" d="M411.446,372.3c-64.616,2.692-95.255-14.6-95.255-14.6l-60.121-11.895l0.003-0.428l-1.084,0.214&#10;&#9;&#9;&#9;l-1.084-0.214l0.003,0.428l-60.121,11.895c0,0-30.64,17.293-95.255,14.6L68.204,499.925h186.784H442.13L411.446,372.3z"/>
<path style="fill:#FFCEBF;" d="M291.728,291.481L291.728,291.481l-73.48,0v0c0,24.283-8.675,47.767-24.462,66.218l1.927,2.216&#10;&#9;&#9;&#9;c4.985,5.734,11.021,10.48,17.819,13.873c25.887,12.92,56.359,13.044,82.306,0.439c7.961-3.867,14.902-9.554,20.352-16.528v0&#10;&#9;&#9;&#9;C300.403,339.248,291.728,315.764,291.728,291.481z"/>
<path style="fill:#D77F4A;" d="M137.497,142.363c3.02,23.928,10.565,42.042,10.565,42.042l215.877,0&#10;&#9;&#9;&#9;c0,0,9.996-14.52,19.282-37.554"/>
<ellipse style="fill:#FFCEBF;" cx="256" cy="197.248" rx="108.427" ry="135.37"/>
<path style="fill:#FFBBAA;" d="M313.264,82.287c19.269,24.435,31.163,57.962,31.163,94.961c0,74.763-48.545,135.37-108.427,135.37&#10;&#9;&#9;&#9;c-21.024,0-40.646-7.478-57.264-20.409c19.667,24.94,47.017,40.409,77.264,40.409c59.883,0,108.427-60.607,108.427-135.37&#10;&#9;&#9;&#9;C364.427,148.733,343.981,106.187,313.264,82.287z"/>
<path style="fill:#D77F4A;" d="M256,56.149c-56.413,0-107.939,58.157-107.939,128.256l0,0c0,0,31.222-60.851,53.686-44.804&#10;&#9;&#9;&#9;c21.226,15.161,38.065,15.919,54.252,15.919c16.187,0,33.026-0.758,54.252-15.919c22.465-16.046,53.686,44.804,53.686,44.804l0,0&#10;&#9;&#9;&#9;C364.427,114.305,312.413,56.149,256,56.149z"/>
<path style="fill:#FFE177;" d="M169.835,248.2l-27.1-10.507l-27.1-10.507c0,0-81.573,129.986-99.523,176.281&#10;&#9;&#9;&#9;s-7.257,79.017,26.618,92.151c33.874,13.134,63.831-3.827,81.781-50.122S169.835,248.2,169.835,248.2z"/>
<path style="fill:#FFCEBF;" d="M124.683,230.694l-1.69-33.678c-0.815-16.248,5.815-31.983,18.013-42.748l46.186-40.76&#10;&#9;&#9;&#9;c2.712-2.394,6.358-3.438,9.926-2.843l0,0c5.794,0.966,10.04,5.979,10.04,11.852v4.179c0,3.777-1.262,7.446-3.585,10.424&#10;&#9;&#9;&#9;l-21.125,29.884c-11.073,15.664-17.019,34.376-17.019,53.559v25.929L124.683,230.694z"/>
<path style="fill:#FFE177;" d="M342.165,248.2l27.1-10.507l27.1-10.507c0,0,81.573,129.986,99.523,176.281&#10;&#9;&#9;&#9;s7.257,79.017-26.618,92.151c-33.874,13.134-63.831-3.827-81.781-50.122C369.539,399.201,342.165,248.2,342.165,248.2z"/>
<path style="fill:#FFD15B;" d="M495.887,403.467c-17.95-46.295-99.523-176.281-99.523-176.281l-24.167,9.37&#10;&#9;&#9;&#9;c18.974,30.625,78.653,128.128,93.69,166.911c17.95,46.295,7.257,79.017-26.617,92.151c-2.073,0.804-4.131,1.491-6.173,2.07&#10;&#9;&#9;&#9;c11.214,3.55,23.415,2.877,36.173-2.07C503.144,482.484,513.837,449.762,495.887,403.467z"/>
<path style="fill:#FFCEBF;" d="M387.317,230.694l1.69-33.678c0.815-16.248-5.815-31.983-18.013-42.748l-46.186-40.76&#10;&#9;&#9;&#9;c-2.712-2.394-6.358-3.438-9.926-2.843l0,0c-5.794,0.966-10.04,5.979-10.04,11.852v4.179c0,3.777,1.262,7.446,3.585,10.424&#10;&#9;&#9;&#9;l21.125,29.884c11.073,15.664,17.019,34.376,17.019,53.559v25.929L387.317,230.694z"/>
</g>
<g>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M415.086,252.718c10.11-1.341,18.119-9.671,19.022-19.829c0.325-3.661-0.246-7.155-1.519-10.29&#10;&#9;&#9;&#9;c-1.425-3.51-0.084-7.614,3.318-9.279c7.319-3.582,12.36-11.1,12.36-19.798c0-6.286-2.632-11.957-6.855-15.972&#10;&#9;&#9;&#9;c-2.615-2.486-3.009-6.596-0.766-9.422c2.985-3.76,4.768-8.516,4.768-13.69c0-7.532-3.779-14.18-9.545-18.154&#10;&#9;&#9;&#9;c-2.55-1.758-3.507-5.012-2.611-7.976c0.61-2.017,0.939-4.156,0.939-6.372c0-12.171-9.867-22.038-22.038-22.038&#10;&#9;&#9;&#9;c-0.271,0-0.071-6.017-0.74-9.253c-1.918-9.281-9.745-16.43-19.169-17.43c-1.211-0.128-2.405-0.159-3.575-0.098&#10;&#9;&#9;&#9;c-4.869,0.254-8.772-3.822-8.748-8.698c0-0.048,0-0.096,0-0.144c0-15.711-12.736-28.447-28.447-28.447&#10;&#9;&#9;&#9;c-0.174,0-5.572-18.923-21.496-16.566c-2.241,0.332-4.449,0.35-6.501,0.998c-4.71,1.488-9.938,0.436-13.691-2.776&#10;&#9;&#9;&#9;c-3.767-3.224-8.658-5.172-14.005-5.172c-4.18,0-8.08,1.19-11.383,3.249c-3.962,2.47-8.786,3.357-13.275,2.075&#10;&#9;&#9;&#9;c-1.881-0.537-3.868-0.825-5.922-0.825c-2.476,0-4.854,0.418-7.068,1.187c-4.807,1.67-10.112,0.693-14.313-2.179&#10;&#9;&#9;&#9;c-3.457-2.363-7.638-3.745-12.142-3.745c-4.802,0-9.235,1.571-12.817,4.225c-4.543,3.367-10.438,4.225-15.632,1.989&#10;&#9;&#9;&#9;c-2.968-1.278-6.239-1.986-9.676-1.986c-8.8,0-16.516,4.636-20.841,11.599c-2.887,4.648-7.74,7.748-13.208,7.944&#10;&#9;&#9;&#9;c-0.279,0.01-0.558,0.024-0.839,0.042c-14.402,0.942-26.008,12.822-26.575,27.244c-0.019,0.481-0.026,0.959-0.021,1.434&#10;&#9;&#9;&#9;c0.049,4.851-4.092,8.753-8.939,8.542c-1.105-0.048-2.231-0.015-3.372,0.105c-9.425,0.994-17.256,8.14-19.18,17.42&#10;&#9;&#9;&#9;c-0.672,3.24-0.472,9.263-0.743,9.263c-12.171,0-22.038,9.867-22.038,22.038c0,2.216,0.328,4.355,0.938,6.372&#10;&#9;&#9;&#9;c0.897,2.965-0.061,6.219-2.611,7.976c-5.765,3.974-9.545,10.622-9.545,18.154c0,5.174,1.783,9.93,4.768,13.69&#10;&#9;&#9;&#9;c2.243,2.826,1.849,6.936-0.766,9.422c-4.222,4.014-6.855,9.685-6.855,15.972c0,8.699,5.041,16.216,12.36,19.798&#10;&#9;&#9;&#9;c3.401,1.664,4.745,5.766,3.32,9.274c-1.279,3.149-1.851,6.66-1.517,10.338c0.922,10.154,8.945,18.467,19.054,19.791"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M201.748,139.601c21.226,15.161,38.065,15.919,54.252,15.919c16.187,0,33.026-0.758,54.252-15.919"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="35.204" y1="223.363" x2="35.204" y2="227.85"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="35.204" y1="261.166" x2="35.204" y2="256.678"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="53.103" y1="242.264" x2="48.615" y2="242.264"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="17.306" y1="242.264" x2="21.794" y2="242.264"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M363.942,370.537c-32.235-4.08-47.751-12.838-47.751-12.838"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="374.066" y1="499.925" x2="442.13" y2="499.925"/>
<polyline style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" points="&#10;&#9;&#9;&#9;68.204,499.925 254.988,499.925 340.066,499.925 &#9;&#9;"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M193.786,357.699c0,0-15.865,8.954-48.838,12.973"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M212.237,325.956c-4.145,11.522-10.365,22.293-18.45,31.743l1.927,2.216c4.985,5.734,11.021,10.48,17.819,13.873&#10;&#9;&#9;&#9;c25.887,12.92,56.359,13.044,82.306,0.439c7.961-3.867,14.902-9.554,20.352-16.528v0c-8.202-9.586-14.484-20.53-18.627-32.239"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M345.91,272.934c-19.485,36.009-52.483,59.683-89.91,59.683c-37.853,0-71.176-24.217-90.571-60.919"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M61.79,316.421c-19.28,33.219-38.119,67.552-45.678,87.046c-17.95,46.295-7.257,79.017,26.618,92.151&#10;&#9;&#9;&#9;c33.874,13.134,63.831-3.827,81.781-50.122S169.835,248.2,169.835,248.2l-27.1-10.507l-27.1-10.507&#10;&#9;&#9;&#9;c0,0-16.714,26.634-36.675,60.083"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M32.38,16.905l7.925,23.552c1.414,4.203,6.751,5.46,9.892,2.329l8.161-8.135c3.103-3.093,8.368-1.911,9.851,2.212l8.999,25.015"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="473.796" y1="233.363" x2="473.796" y2="237.85"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="473.796" y1="271.166" x2="473.796" y2="266.678"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="455.897" y1="252.264" x2="460.385" y2="252.264"/>
<line style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" x1="491.694" y1="252.264" x2="487.206" y2="252.264"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M483.621,16.905l-7.925,23.552c-1.414,4.203-6.751,5.46-9.892,2.329l-8.161-8.135c-3.103-3.093-8.368-1.911-9.851,2.212&#10;&#9;&#9;&#9;l-8.999,25.015"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M124.683,230.694l-1.69-33.678c-0.815-16.248,5.815-31.983,18.013-42.748l46.186-40.76c2.712-2.394,6.358-3.438,9.926-2.843l0,0&#10;&#9;&#9;&#9;c5.794,0.966,10.04,5.979,10.04,11.852v4.179c0,3.777-1.262,7.446-3.585,10.424l-21.125,29.884&#10;&#9;&#9;&#9;c-11.073,15.664-17.019,34.376-17.019,53.559v25.929L124.683,230.694z"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M450.21,316.421c19.28,33.219,38.119,67.552,45.678,87.046c17.95,46.295,7.257,79.017-26.618,92.151&#10;&#9;&#9;&#9;c-33.874,13.134-63.831-3.827-81.781-50.122c-17.95-46.295-45.324-197.296-45.324-197.296l27.1-10.507l27.1-10.507&#10;&#9;&#9;&#9;c0,0,16.714,26.634,36.675,60.083"/>
<path style="fill:none;stroke:#000000;stroke-width:15;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;" d="&#10;&#9;&#9;&#9;M387.317,230.694l1.69-33.678c0.815-16.248-5.815-31.983-18.013-42.748l-46.186-40.76c-2.712-2.394-6.358-3.438-9.926-2.843l0,0&#10;&#9;&#9;&#9;c-5.794,0.966-10.04,5.979-10.04,11.852v4.179c0,3.777,1.262,7.446,3.585,10.424l21.125,29.884&#10;&#9;&#9;&#9;c11.073,15.664,17.019,34.376,17.019,53.559v25.929L387.317,230.694z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg696"
xml:space="preserve"
width="682.66669"
height="682.66669"
viewBox="0 0 682.66669 682.66669"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs700"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath710"><path
d="M 0,512 H 512 V 0 H 0 Z"
id="path708" /></clipPath></defs><g
id="g702"
transform="matrix(1.3333333,0,0,-1.3333333,0,682.66667)"><g
id="g704"><g
id="g706"
clip-path="url(#clipPath710)"><g
id="g712"
transform="translate(9.0435,355.2871)"><path
d="m 0,0 c 0.338,7.053 1.429,13.958 3.178,20.649 0.142,0.541 0.287,1.08 0.437,1.618 3.918,14.057 10.739,27.135 19.571,38.611 21.46,27.886 54.8,46.31 87.238,46.31 37.457,0 69.076,-22.555 83.697,-35.027 4.971,-4.241 12.285,-4.164 17.183,0.161 14.161,12.505 44.933,34.866 83.904,34.866 52.616,0 107.611,-48.482 110.423,-107.188 0.878,-18.368 -1.675,-34.297 -6.411,-48.745 -3.814,-11.637 -9.041,-22.316 -15.057,-32.515 -19.996,-33.905 -115.745,-106.958 -157.552,-142.348 -13.836,-11.712 -34.105,-11.709 -47.936,0.009 C 136.981,-188.276 41.584,-115.437 21.468,-81.26 12.443,-65.927 5.214,-49.612 1.863,-30.601 0.196,-21.138 -0.527,-11.02 0,0"
style="fill:#ff7d97;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path714" /></g><g
id="g716"
transform="translate(262.0469,153.4565)"><path
d="m 0,0 c -9.998,-8.147 -19.031,-15.546 -26.392,-21.777 -13.837,-11.713 -34.105,-11.709 -47.937,0.009 -41.693,35.323 -137.09,108.162 -157.206,142.338 -9.025,15.333 -16.255,31.649 -19.605,50.66 -0.343,1.947 -0.647,3.922 -0.907,5.927"
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path718" /></g><g
id="g720"
transform="translate(34.6689,419.2329)"><path
d="m 0,0 c 21.497,26.161 53.565,43.242 84.798,43.242 37.458,0 69.076,-22.555 83.697,-35.027 4.971,-4.241 12.286,-4.164 17.184,0.161 14.161,12.505 44.932,34.866 83.903,34.866 52.616,0 107.611,-48.482 110.424,-107.188 0.878,-18.367 -1.676,-34.297 -6.411,-48.745 -1.877,-5.726 -4.096,-11.221 -6.583,-16.54"
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path722" /></g><g
id="g724"
transform="translate(12.3311,376.3408)"><path
d="M 0,0 V 0"
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path726" /></g><g
id="g728"
transform="translate(502,169.7637)"><path
d="m 0,0 c 0,-66.406 -53.399,-120.239 -119.271,-120.239 -65.872,0 -119.271,53.833 -119.271,120.239 0,66.406 53.399,120.239 119.271,120.239 C -53.399,120.239 0,66.406 0,0"
style="fill:#faf7f5;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path730" /></g><g
id="g732"
transform="translate(502,169.7637)"><path
d="m 0,0 c 0,-66.406 -53.399,-120.239 -119.271,-120.239 -65.872,0 -119.271,53.833 -119.271,120.239 0,66.406 53.399,120.239 119.271,120.239 C -53.399,120.239 0,66.406 0,0 Z"
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path734" /></g><g
id="g736"
transform="translate(430.6279,194.124)"><path
d="m 0,0 h -23.744 v 23.952 c 0,6.765 -5.44,12.248 -12.15,12.248 h -24.01 c -6.71,0 -12.15,-5.483 -12.15,-12.248 V 0 h -23.744 c -6.71,0 -12.149,-5.483 -12.149,-12.248 v -24.225 c 0,-6.764 5.439,-12.247 12.149,-12.247 h 23.744 v -23.953 c 0,-6.764 5.44,-12.247 12.15,-12.247 h 24.01 c 6.71,0 12.15,5.483 12.15,12.247 V -48.72 H 0 c 6.71,0 12.149,5.483 12.149,12.247 v 24.225 C 12.149,-5.483 6.71,0 0,0"
style="fill:#ff9eb1;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path738" /></g><g
id="g740"
transform="translate(430.6279,194.124)"><path
d="m 0,0 h -23.744 v 23.952 c 0,6.765 -5.44,12.248 -12.15,12.248 h -24.01 c -6.71,0 -12.15,-5.483 -12.15,-12.248 V 0 h -23.744 c -6.71,0 -12.149,-5.483 -12.149,-12.248 v -24.225 c 0,-6.764 5.439,-12.247 12.149,-12.247 h 23.744 v -23.953 c 0,-6.764 5.44,-12.247 12.15,-12.247 h 24.01 c 6.71,0 12.15,5.483 12.15,12.247 V -48.72 H 0 c 6.71,0 12.149,5.483 12.149,12.247 v 24.225 C 12.149,-5.483 6.71,0 0,0 Z"
style="fill:none;stroke:#000000;stroke-width:20;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path742" /></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 5.0 KiB

@ -28,7 +28,8 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
# use_frameworks!
use_frameworks! :linkage => :static
use_modular_headers!
pod 'OpenTok', '~> 2.22.0'

@ -21,8 +21,8 @@ var PACKAGES_ORDERS = '/api/orders';
var PACKAGES_ORDER_HISTORY = '/api/orders/items';
var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara';
// var BASE_URL = 'http://10.50.100.198:2018/';
// var BASE_URL = 'https://uat.hmgwebservices.com/';
var BASE_URL = 'https://hmgwebservices.com/';
var BASE_URL = 'https://uat.hmgwebservices.com/';
// var BASE_URL = 'https://hmgwebservices.com/';
// var BASE_URL = 'https://orash.cloudsolutions.com.sa/';
// var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/';
// var BASE_URL = 'https://vidamergeuat.cloudsolutions.com.sa/';

@ -2,23 +2,39 @@
// Used for Native through Platform Method Channel
// --------- - -- - - - - - - - - ----------------
const Map platformLocalizedValues = {
"errorConnectingHmgNetwork": {"en": "Sorry you are not connecting to HMG network", "ar": "نعتذر لست متصل في شكبة مستشفى د.سليمان الحبيب"},
"successConnectingHmgNetwork": {"en": "You connected to HMG network successfully, you can access the app", "ar": "تم التصال بشبكة د.سليمان الحبيب بنجاح, تستطيع الان استخدام تطبيق الحبيب"},
"errorConnectingHmgNetwork": {
"en": "Sorry you are not connecting to network",
"ar": "نعتذر لست متصل في شكبة مستشفى د.سليمان الحبيب"
},
"successConnectingHmgNetwork": {
"en": "You connected to network successfully, you can access the app",
"ar":
"تم التصال بشبكة د.سليمان الحبيب بنجاح, تستطيع الان استخدام تطبيق الحبيب"
},
"failedConnectingHmgNetwork": {
"en": "Sorry the connection to HMG network had been failed, make sure you are in range of HMG network",
"en":
"Sorry the connection to network had been failed, make sure you are in range of network",
"ar": "نعتذر لقد فشل الاتصال بشبكة د.سليمان الحبيب, تاكد من وجودك داخل نطاق الشبكة"
},
"alreadyConnectedHmgNetwork": {"en": " You already connected to HMG network to access Alhabib app", "ar": "انت متصل مسبقاً بالشبكة تستطيع استخدام تطبيق الحبيب"},
"alreadyConnectedHmgNetwork": {
"en": " You already connected to network to access Alhabib app",
"ar": "انت متصل مسبقاً بالشبكة تستطيع استخدام تطبيق الحبيب"
},
"somethingWentWrong": {"en": "Sorry something went wrong please try again later", "ar": "نعتذر لخدمتكم يرجى المحاولة لاحقا"},
"enablingWifi": {"en": "Enabling wifi...", "ar": "Enabling wifi..."},
"connectedHmgNetworkWithInternet": {"en": "Successfully connected to the HMG network to access internet", "ar": "Successfully connected to the HMG network to access internet"},
"connectedHmgNetworkWithInternet": {
"en": "Successfully connected to the network to access internet",
"ar": "Successfully connected to the HMG network to access internet"
},
"connectedToHmgNetworkWithNoInternet": {
"en": "Successfully connected to the HMG network but it have no internet access",
"ar": "Successfully connected to the HMG network but it have no internet access"
"en":
"Successfully connected to the network but it have no internet access",
"ar":
"Successfully connected to the network but it have no internet access"
},
"notConnectedToHmgNetworkSecurityIssue": {
"en": "We are not able to connect you to HMG network due to security reasons",
"ar": "We are not able to connect you to HMG network due to security reasons"
"en": "We are not able to connect you to network due to security reasons",
"ar": "We are not able to connect you to network due to security reasons"
}
};
@ -123,9 +139,18 @@ const Map localizedValues = {
"welcome": {"en": "Welcome", "ar": "مرحبا بكم"},
"welcome-to": {"en": "Welcome to", "ar": "مرحبا بك في"},
"patient-app": {"en": "Patient App", "ar": "تطبيق المراجعين"},
"welcome_text": {"en": "Dr. Sulaiman Al Habib Mobile Application", "ar": "الدكتور سليمان الحبيب لتطبيقات الهاتف"},
"dr-sulaiman-text": {"en": "Dr. Sulaiman Al Habib", "ar": "د. سليمان الحبيب"},
'welcome_text2': {'en': 'Have you previously visited the hospitals or medical centers of Dr. Sulaiman Al Habib?', 'ar': 'هل قمت مسبقا بزيارة مستشفيات او مراكز الدكتور سليمان الحبيب الطبية ؟'},
"welcome_text": {
"en": "Vida Mobile Application",
"ar": "تطبيق فيدا للموبايل"
},
"dr-sulaiman-text": {
"en": "Vida Mobile Application",
"ar": "تطبيق فيدا للموبايل"
},
'welcome_text2': {
'en': 'Have you previously visited the hospitals or medical centers?',
'ar': "هل سبق لك زيارة المستشفيات أو المراكز الطبية؟"
},
'yes': {'en': 'Yes', 'ar': 'نعم'},
'no': {'en': 'No', 'ar': 'لا'},
"logintyperadio": {"en": " Choose from the below options to login to your medical file.", "ar": " اختر احدى الخيارات أدناه لتسجيل الدخول إلى ملفك الطبي "},
@ -279,7 +304,7 @@ const Map localizedValues = {
"OnlinePaymentService": {"en": "Online Payment Service", 'ar': 'خدمة الدفع الإلكتروني'},
"OffersAndPackages": {"en": "Online transfer request", 'ar': 'طلب التحويل الالكتروني'},
"ComprehensiveMedicalCheckup": {"en": "Comprehensive Medical Check-up", 'ar': 'فحص طبي شامل'},
"HMGService": {"en": "HMG Service", 'ar': 'الخدمات الإلكترونية'},
"HMGService": {"en": "Our Service", 'ar': 'الخدمات الإلكترونية'},
"ViewAllHabibMedicalService": {"en": "View All Habib Medical Service", 'ar': 'عرض خدمات الحبيب الطبية'},
"viewAll": {"en": "View All", 'ar': 'عرض الكل'},
"view": {"en": "View", 'ar': 'عرض'},
@ -298,13 +323,14 @@ const Map localizedValues = {
"logs": {"en": "Logs", "ar": "السجلات"},
"textToSpeech": {"en": "How May I Help You?", "ar": "كيف يمكنني مساعدتك؟"},
"locationDialogMessage": {
"en": "Allow the HMG app to access your location will assist you in showing the hospitals according to the nearest to you.",
"en":
"Allow the app to access your location will assist you in showing the hospitals according to the nearest to you.",
"ar": "السماح لتطبيق مجموعة الحبيب الطبية بالوصول إلى موقعك سيساعدك في إظهار المستشفيات وفقًا للأقرب إليك."
},
"user-view-requester": {"en": "User Wants to View Your Medical File", "ar": "أشخاص يرغبون في الاطلاع على ملفك الطبي"},
"user-view": {"en": "User Can View Your Medical File", "ar": "أشخاص مصرح لهم الاطلاع على ملفك الطبي"},
"parking": {"en": "Parking", "ar": "مواقف"},
"alhabiServices": {"en": "HMG Service", "ar": "خدمات الحبيب"},
"alhabiServices": {"en": "Our Service", "ar": "خدمات الحبيب"},
"parkingTitle": {
"en":
"Car service, car service, service to save parking information, return to it later, 1- By clicking on (Read the code), save the parking data. 2- By clicking on the button (view my car park), it shows you the cars location in Google Maps. 3- Read another position by pressing the Clear Position Data button.",
@ -824,7 +850,7 @@ const Map localizedValues = {
"Feedback": {"en": "Feedback", "ar": "رأيك يهمنا"},
"LiveChat": {"en": "Live Chat", "ar": "محادثة مباشرة"},
"Service": {"en": "Service", "ar": "خدمة"},
"HMGServiceLabel": {"en": "HMG Service", 'ar': 'خدمات الحبيب'},
"HMGServiceLabel": {"en": "Our Service", 'ar': 'خدمات الحبيب'},
"HealthWeatherIndicators": {"en": "Health Weather Indicators", 'ar': ' مؤشرات الطقس الصحية '},
"HealthTipsBasedOnCurrentWeather": {"en": "Health Tips Based On Current Weather", 'ar': ' نصائح صحية بناءاً على الطقس الحالي '},
"MoreDetails": {"en": "More details", "ar": " المزيد من التفاصيل "},
@ -889,12 +915,19 @@ const Map localizedValues = {
"blood-instruction": {"en": "Enter the required information, in order to register for Blood Donation Service", "ar": "ادخل المعلومات المطلوبة للتسجيل بخدمة التبرع بالدم"},
"view-terms": {"en": "To view the terms and conditions", "ar": "عرض الشروط والأحكام"},
"wantConnectHmgNetwork": {
"en": "Dear customer there is no internet access, do you want to connect with HMG network to use our app, make sure you are in range of HMG network",
"en":
"Dear customer there is no internet access, do you want to connect with network to use our app, make sure you are in range of network",
"ar": "عزيز العميل لا يوجد اتصال بالإنترنت, هل تريد الاتصال بشبكة مستشفى د. سليمان الحبيب لاستخدام التطبيق. يجب عليك ان تكون في نطاق شبكة المستشفى"
},
"failedToAccessHmgServices": {"en": "Connected with HMG Network,\n\nBut failed to access HMG services", "ar": "Connected with HMG Network,\n\nBut failed to access HMG services"},
"failedToAccessHmgServices": {
"en": "Connected with Network,\n\nBut failed to access services",
"ar": "Connected with Network,\n\nBut failed to access services"
},
"offerAndPackages": {"en": "Offers and Packages", "ar": "العروض والباقات"},
"offerAndPackagesDetails": {"en": "This service allows you to view all HMG Offers:", "ar": "This service allows you to view all HMG Offers:"},
"offerAndPackagesDetails": {
"en": "This service allows you to view all Offers:",
"ar": "This service allows you to view all Offers:"
},
"InvoiceNo": {"en": "Invoice No", "ar": "رقم الفاتورة"},
"InvoiceDate": {"en": "Invoice Date", "ar": "تاريخ الفاتورة"},
"SpecialResult": {"en": " Special Result", "ar": "نتيجة خاصة"},
@ -1008,7 +1041,7 @@ const Map localizedValues = {
"waterTracker": {"en": "Water Tracker", "ar": "حساب كمية الماء"},
"h2o": {"en": "H2O", "ar": "استهلاك"},
"v-tour": {"en": "Virtual Tour", "ar": "جولة إفتراضية"},
"hmg-news": {"en": "HMG News", "ar": "أخبار المجموعة"},
"hmg-news": {"en": " News", "ar": "أخبار المجموعة"},
"blood-d": {"en": "Blood Donation", "ar": "تبرع بالدم"},
"symptomCheckerTitle": {"en": "Symptom Checker", "ar": "مدقق الأعراض"},
"latest-news": {"en": "Latest News", "ar": "أحدث الأخبار"},
@ -1335,9 +1368,9 @@ const Map localizedValues = {
"please_select_gender": {"en": "Please select gender", "ar": "يرجى تحديد الجنس"},
"covid-info": {
"en":
"Dr. Sulaiman Al Habib hospitals are conducting a test for the emerging corona virus and issuing travel certificates 24/7 in a short time and with high accuracy. Those wishing to benefit from this service can visit one of Dr. Sulaiman Al Habib branches to conduct a corona test within few minutes, and obtain the result within several hours. Corona Virus Covid 19 testing service with PCR technology to detect the virus according to the highest international standards and with the latest high-precision RT-PCR devices (American GeneXpert and others), That is approved by the Food and Drug Authority as well as by the Saudi Center for Infectious Diseases Prevention.",
"Hospitals are conducting a test for the emerging corona virus and issuing travel certificates 24/7 in a short time and with high accuracy. Those wishing to benefit from this service can visit one of branches to conduct a corona test within few minutes, and obtain the result within several hours. Corona Virus Covid 19 testing service with PCR technology to detect the virus according to the highest international standards and with the latest high-precision RT-PCR devices (American GeneXpert and others), That is approved by the Food and Drug Authority as well as by the Saudi Center for Infectious Diseases Prevention.",
"ar":
"تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية"
"تقوم المستشفيات بإجراء فحص فيروس كورونا المستجد وإصدار شهادات السفر على مدار الساعة وطوال أيام الأسبوع في وقت قصير وبدقة عالية، ويمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد الفروع لإجراء فحص كورونا خلال دقائق معدودة، والحصول على النتيجة خلال عدة ساعات. خدمة فحص فيروس كورونا كوفيد 19 بتقنية PCR للكشف عن الفيروس وفق أعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (جينيكسبرت الأمريكية وغيرها)، المعتمدة من هيئة الغذاء والدواء وكذلك من المركز السعودي للوقاية من الأمراض المعدية."
},
"select-appo": {"en": "Kindly select one of the available appointments from below:", "ar": " يرجى اختيار أحد المواعيد المتاحة مما يلي:"},
"covid-alert-header": {"en": "Pay With-in 15 mins to confirm the appointment", "ar": "الرجاء اتمام عملية الدفع خلال 15 دقيقه لتاكيد الموعد"},
@ -1425,9 +1458,9 @@ const Map localizedValues = {
"type": {"en": "Type", "ar": "اكتب"},
"info-ereferral": {
"en":
"This service allows you to submit a Referral request from any health care providers either inside or outside the kingdom of Saudi Arabia to any of HMG Hospitals, by filling some of the patient's data and attaching the medical reports, moreover you can track the request status (Under process, Accepted or Rejected)",
"This service allows you to submit a Referral request from any health care providers either inside or outside the kingdom of Saudi Arabia to any of Hospitals, by filling some of the patient's data and attaching the medical reports, moreover you can track the request status (Under process, Accepted or Rejected)",
"ar":
"تتيح لك هذه الخدمة إرسال طلب إحالة من أي من مقدمي الرعاية الصحية سواء داخل المملكة العربية السعودية أو خارجها إلى أي من مستشفيات HMG ، عن طريق ملء بعض بيانات المراجع وإرفاق التقارير الطبية ، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة ، مقبول أو مرفوض)"
"تتيح لك هذه الخدمة إرسال طلب إحالة من أي من مقدمي الرعاية الصحية سواء داخل المملكة العربية السعودية أو خارجها إلى أي من مستشفيات ، عن طريق ملء بعض بيانات المراجع وإرفاق التقارير الطبية ، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة ، مقبول أو مرفوض)"
},
"er-consultation": {
"en": "This service allows you to make an online virtual consultation via video call directly with the doctor from anywhere at any time.",
@ -1805,7 +1838,7 @@ const Map localizedValues = {
"connectSubtitle": {"en": "With us", "ar": "معنا"},
"covidConsent": {
"en":
"Covid-19 Test feature allows you to book an appointment for the Covid-19 Lab test within HMG branches, where a swab sample will be collected & processed. Once the result has been processed, we shall notify you via SMS on your registered mobile number & the test result will also be available in the Lab Results section of this app. Please note that this result is only available to you & not publicly available to anyone else.",
"Covid-19 Test feature allows you to book an appointment for the Covid-19 Lab test within branches, where a swab sample will be collected & processed. Once the result has been processed, we shall notify you via SMS on your registered mobile number & the test result will also be available in the Lab Results section of this app. Please note that this result is only available to you & not publicly available to anyone else.",
"ar":
"تتيح لك ميزة اختبار كوفيد19 حجز موعد في احد فروع مجموعة الحبيب الطبية ، حيث سيتم اخذ عينة المسحة ومعالجتها. بمجرد معالجة النتيجة ، سنخطرك عبر رسالة نصية قصيرة على رقم هاتفك المحمول المسجل وستكون نتيجة الاختبار متاحة أيضًا على التطبيق في قسم نتائج المختبر. يرجى ملاحظة أن هذه النتيجة متاحة لك فقط وليست متاحة للجمهور او اي شخص آخر. الرجاء الموافقة للتأكيد والمتابعة."
},
@ -1824,7 +1857,7 @@ const Map localizedValues = {
},
"locationPermissionDialog": {
"en":
"Dr. Al Habib app collects location data to show the nearest HMG hospitals and ER Locations and provides health care services to your location and Health weather indicators service and the medication delivery.",
"Dr. Al Habib app collects location data to show the nearest hospitals and ER Locations and provides health care services to your location and Health weather indicators service and the medication delivery.",
"ar": "يحتاج تطبيق دكتور الحبيب إلى صلاحية الوصول الى الموقع لإظهار أقرب مستشفيات المجموعة، مواقع الطوارئ، تقديم خدمات الرعاية الصحية إلى موقعك، خدمة مؤشرات الطقس الصحية وكذلك خدمة توصيل الأدوية."
},
"calendarPermission": {
@ -1836,7 +1869,8 @@ const Map localizedValues = {
"ar": "يحتاج تطبيق دكتور الحبيب إلى صلاحية الوصول الى الصوت لتفعيل خدمة الأوامر الصوتية."
},
"wifiPermission": {
"en": "Dr. Al Habib app needs to access WiFi state permission to connect to the HMG WiFi network from within the app when you visit the hospital.",
"en":
"Dr. Al Habib app needs to access WiFi state permission to connect to the WiFi network from within the app when you visit the hospital.",
"ar": "يحتاج تطبيق دكتور الحبيب إلى الوصول إلى الواي فاي للاتصال بشبكة الواي فاي في المجموعة عند زيارة المستشفى."
},
"physicalActivityPermission": {
@ -1891,11 +1925,15 @@ const Map localizedValues = {
"pharmaLiveCare": {"en": "Pharma LiveCare", "ar": "لايف كير الصيدلية"},
"pharmaLiveCare1": {"en": "What is Pharma LiveCare?", "ar": "ما هولايف كير الصيدلية؟"},
"pharmaLiveCareDesc1": {
"en": "Pharma LiveCare allows you to get consultation from your doctor virtually being in HMG Pharmacy booth.",
"en":
"Pharma LiveCare allows you to get consultation from your doctor virtually being in Pharmacy booth.",
"ar": "تتيح لك خدمة لايف كير الصيدلية الحصول على استشارة من طبيبك المتواجد فعليًا في كشك صيدلية د.سليمان الحبيب."
},
"wherePharmaLiveCare": {"en": "Where can i find Pharma LiveCare?", "ar": "أين يمكنني أن أجد لايف كير الصيدلية؟"},
"pharmaLiveCareDesc2": {"en": "You can find the booth in HMG Pharmacies.", "ar": "يمكنك العثور على الكشك في صيدليات مستشفى د.سليمان الحبيب."},
"pharmaLiveCareDesc2": {
"en": "You can find the booth in Pharmacies.",
"ar": "يمكنك العثور على الكشك في صيدليات مستشفى د.سليمان الحبيب."
},
"howPharmaLiveCare": {"en": "How can i use Pharma LiveCare?", "ar": "كيف يمكنني استخدام لايف كير الصيدلية؟"},
"pharmaLiveCareDesc3": {
"en": "Following the below steps you can easily benefit from the virtual consultation service:",
@ -2049,7 +2087,7 @@ const Map localizedValues = {
"communicationConsent": {"en": "COMMUNICATION VIA EMAIL, TEXT MESSAGES AND PHONE CALLS: ", "ar": "الاتصال عبر البريد الإلكتروني والرسائل النصية والمكالمات الهاتفية: "},
"generalConsent3": {
"en":
"I understand that the contact number or Email that I have provided on registration will be used for communication by the Hospital. I hereby agree to be notified by the Hospital through SMS, Email, phone calls or any other method, for appointments notifications, special promotions, new features or products, current HMG's medical services, and of any services introduced by the Hospital or any third party in the future or any modifications made to the services offered by the Hospital. And these messages may be submitted as evidence where the Hospital has the right to use at any time whatsoever and as it sees fit. I understand the risks of communicating by email and text messages, in particular the privacy risks. I understand that the Hospital cannot guarantee the security and confidentiality of email or text communication. The Hospital will not be responsible for messages that are not received or delivered due to technical failure, or for disclosure of confidential information unless caused by intentional misconduct.",
"I understand that the contact number or Email that I have provided on registration will be used for communication by the Hospital. I hereby agree to be notified by the Hospital through SMS, Email, phone calls or any other method, for appointments notifications, special promotions, new features or products, current medical services, and of any services introduced by the Hospital or any third party in the future or any modifications made to the services offered by the Hospital. And these messages may be submitted as evidence where the Hospital has the right to use at any time whatsoever and as it sees fit. I understand the risks of communicating by email and text messages, in particular the privacy risks. I understand that the Hospital cannot guarantee the security and confidentiality of email or text communication. The Hospital will not be responsible for messages that are not received or delivered due to technical failure, or for disclosure of confidential information unless caused by intentional misconduct.",
"ar":
"المستشفى أدرك بأن رقم الجوال الهاتف أو البريد الإلكتروني الذي قدمته في نموذج التسجيل سيستخدم كوسيلة اتصال بيني وبين | وأقر بموافقتي على قيام المستشفى بإخطاري عن طريق رسائل البريد أو الرسائل القصيرة أو البريد الإلكتروني أو المكالمات الهاتفية أو أي طريقة أخرى بالمواعيد والعروض الترويجية أو المميزات والمنتجات الخاصة بالمستشفى أو) خاصة بأي طرف خارجي) وبأي خدمات طبية تقدمها المجموعة أو قد يطرحها المستشفى في المستقبل أو أي تعديلات قد تطرأ على الخدمات المقدمة من قبل المستشفى. وتعتبر هذه الرسائل دليل إثبات يحق للمستشفى استخدامه في اي وقت يشاء. أفهم مخاطر التواصل عبر البريد الإلكتروني والرسائل النصية خاصة مخاطر الخصوصية وأدرك أن المستشفى لا يمكنه ضمان أمن وسرية البريد الإلكتروني أو الرسائل النصية ولن يكون المستشفى مسؤول عن الرسائل التي لم يتم استلامها أو تسليمها بسبب الفشل التقني أو الكشف عن المعلومات السرية ما لم يكن سببها سوء سلوك متعمد."
},
@ -2140,4 +2178,29 @@ const Map localizedValues = {
"download": {"en": "Download", "ar": "تحميل"},
"share": {"en": "Share", "ar": "يشارك"},
"byFace": {"en": "By Face", "ar": "حسب الوجه"},
"stress": {"en": "Stress", "ar": "ضغط"},
"cvd": {"en": "Cardiovascular Disease (CVD) Risk", "ar": "مخاطر أمراض القلب والأوعية الدموية (CVD)"},
"generalWellness": {"en": "General Wellness", "ar": "العافية العامة"},
"BMI": {"en": "BMI", "ar": "مؤشر كتله الجسم"},
"respiratoryRate": {"en": "Respiratory Rate", "ar": "معدل التنفس"},
"oxygenSaturation": {"en": "Oxygen Saturation", "ar": "تشبع الأكسجين"},
"scanning": {"en": "Scanning", "ar": "المسح الضوئي"},
"normal": {"en": "Normal", "ar": "عادي"},
"poor": {"en": "Poor", "ar": "فقير"},
"low": {"en": "Low", "ar": "منخفض"},
"atRisk": {"en": "At Risk", "ar": "في خطر"},
"high": {"en": "High", "ar": "عال"},
"moderatelyHigh": {"en": "Moderately high", "ar": "مرتفع بشكل معتدل"},
"possiblyLow": {"en": "Possibly low", "ar": "ربما منخفض"},
"slightylyHigh": {"en": "Slightly high", "ar": "مرتفع قليلا"},
'frameRate': {'ar': 'معدل الإطارات', 'en': 'FrameRate'},
'movement': {'ar': 'الحركة', 'en': 'Movement'},
'centered': {'ar': 'مركّز', 'en': 'Centered'},
'lighting': {'ar': 'الإضاءة', 'en': 'Lighting'},
'scanningConditions': {'ar': 'شروط المسح', 'en': 'Scanning Conditions'},
'serverReady': {'ar': 'الخادم جاهز', 'en': 'Server Ready'},
'analyzingData': {'ar': 'تحليل البيانات...', 'en': 'Analyzing Data...'},
'collectingData': {'ar': 'جمع البيانات...', 'en': 'Collecting Data...'},
'waitingData': {'ar': 'انتظار البيانات...', 'en': 'Waiting Data...'},
};

@ -1,19 +1,15 @@
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/core/viewModels/dashboard_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/models/Appointments/AppoimentAllHistoryResultList.dart';
import 'package:diplomaticquarterapp/models/Appointments/toDoCountProviderModel.dart';
import 'package:diplomaticquarterapp/models/Authentication/authenticated_user.dart';
import 'package:diplomaticquarterapp/models/apple_pay_response.dart';
import 'package:diplomaticquarterapp/models/gradient_color.dart';
import 'package:diplomaticquarterapp/models/hmg_services.dart';
import 'package:diplomaticquarterapp/models/slider_data.dart';
import 'package:diplomaticquarterapp/pages/AlHabibMedicalService/all_habib_medical_service_page2.dart';
import 'package:diplomaticquarterapp/pages/ErService/ErOptions.dart';
import 'package:diplomaticquarterapp/pages/landing/widgets/logged_slider_view.dart';
import 'package:diplomaticquarterapp/pages/landing/widgets/services_view.dart';
import 'package:diplomaticquarterapp/pages/landing/widgets/slider_view.dart';
import 'package:diplomaticquarterapp/pages/packages_offers/packages_offers_tab_pager.dart';
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
@ -60,6 +56,12 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
? hmgServices.add(HmgServices(2, TranslationBase.of(context).hospitalNavigationTitle, TranslationBase.of(context).hospitalNavigationSubtitle, "assets/images/new/indoor_nav_home.svg", isLogin,
isLocked: !projectViewModel.havePrivilege(107)))
: hmgServices.add(HmgServices(2, TranslationBase.of(context).emergencyTitle, TranslationBase.of(context).emergencySubtitle, "assets/images/new/emergency.svg", isLogin));
hmgServices.add(HmgServices(
111,
TranslationBase.of(context).vitalSign,
TranslationBase.of(context).byFace,
"assets/images/new/facial-recognition.svg",
isLogin));
hmgServices.add(
HmgServices(9, TranslationBase.of(context).emergency, TranslationBase.of(context).checkinOptions, "assets/images/new/emergency.svg", isLogin, isLocked: !projectViewModel.havePrivilege(108)));
@ -231,19 +233,19 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
height: 1,
color: Color(0xFFC7C7C7),
),
Container(
width: double.infinity,
height: MediaQuery.of(context).size.width * 0.3,
padding: EdgeInsets.only(left: 20, right: 20, top: 14, bottom: 14),
color: Colors.white,
child: Row(
children: [
offersButton(),
mWidth(10),
hmgButton(),
],
),
),
// Container(
// width: double.infinity,
// height: MediaQuery.of(context).size.width * 0.3,
// padding: EdgeInsets.only(left: 20, right: 20, top: 14, bottom: 14),
// color: Colors.white,
// child: Row(
// children: [
// // offersButton(),
// mWidth(10),
// // hmgButton(),
// ],
// ),
// ),
Divider(
height: 1,
color: Color(0xFFC7C7C7),
@ -376,263 +378,263 @@ class _HomePageFragment2State extends State<HomePageFragment2> {
);
}
Widget offersButton() {
final bypassPrivilageCheck = false;
return Expanded(
flex: 1,
child: InkWell(
onTap: () {
// Navigator.of(context).push(MaterialPageRoute(builder: (context) => ErOptions(isAppbar: true)));
Navigator.push(context, FadePage(page: ErOptions(isAppbar: true)));
},
child: Stack(
children: [
Container(
width: double.infinity,
height: double.infinity,
clipBehavior: Clip.antiAlias,
decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor),
child: Stack(
children: [
Container(
width: double.infinity,
height: double.infinity,
// color: Color(0xFF2B353E),
decoration: containerRadius(CustomColors.accentColor, 20),
),
Container(
width: double.infinity,
height: double.infinity,
clipBehavior: Clip.antiAlias,
decoration: projectViewModel.isArabic
? containerBottomRightRadiusWithGradientForAr(60, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor)
: containerBottomRightRadiusWithGradient(60, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor),
child: Stack(
children: [
SvgPicture.asset(
"assets/images/new/strips.svg",
width: double.infinity,
height: double.infinity,
fit: BoxFit.cover,
),
],
),
),
projectViewModel.isArabic
? Positioned(
left: 20,
top: 12,
child: Opacity(
opacity: 0.5,
child: SvgPicture.asset(
"assets/images/new/emergency_services_back.svg",
height: MediaQuery.of(context).size.width * 0.14,
),
),
)
: Positioned(
right: 20,
top: 12,
child: Opacity(
opacity: 0.5,
child: SvgPicture.asset(
"assets/images/new/emergency_services_back.svg",
height: MediaQuery.of(context).size.width * 0.14,
),
),
),
Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(SizeConfig.widthMultiplier! * 3.4),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
child: SvgPicture.asset(
"assets/images/new/emergency_services.svg",
height: MediaQuery.of(context).size.width * 0.08,
),
),
mFlex(1),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
TranslationBase.of(context).emergencyServices,
style: TextStyle(
color: Colors.black,
fontSize: 14,
fontWeight: FontWeight.bold,
letterSpacing: -0.45,
height: 1,
),
),
projectViewModel.isArabic ? mHeight(5) : Container(),
Text(
TranslationBase.of(context).emergencyServicesSubtitle,
style: TextStyle(
color: Colors.black,
fontSize: 9,
fontWeight: FontWeight.w600,
letterSpacing: -0.27,
height: projectViewModel.isArabic ? 0.2 : 1,
),
),
],
),
],
),
),
],
),
),
// projectViewModel.havePrivilege(82) || bypassPrivilageCheck
// ? Container()
// : Container(
// width: double.infinity,
// height: double.infinity,
// clipBehavior: Clip.antiAlias,
// decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor.withOpacity(0.7), darkColor: CustomColors.lightGreyColor.withOpacity(0.7)),
// child: Icon(
// Icons.lock_outline,
// size: 40,
// ),
// )
],
),
),
);
}
Widget hmgButton() {
return Expanded(
flex: 1,
child: InkWell(
onTap: () {
if (projectViewModel.havePrivilege(100)) widget.onPharmacyClick!();
},
child: Stack(children: [
Container(
width: double.infinity,
height: double.infinity,
clipBehavior: Clip.antiAlias,
decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor),
child: Stack(
children: [
Container(
width: double.infinity,
height: double.infinity,
// color: Color(0xFF2B353E),
decoration: containerRadius(Color(0xFF359846), 20),
),
Container(
width: double.infinity,
height: double.infinity,
clipBehavior: Clip.antiAlias,
decoration: projectViewModel.isArabic
? containerBottomRightRadiusWithGradientForAr(60, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor)
: containerBottomRightRadiusWithGradient(60, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor),
child: Stack(
children: [
SvgPicture.asset(
"assets/images/new/strips.svg",
width: double.infinity,
height: double.infinity,
fit: BoxFit.cover,
),
],
),
),
projectViewModel.isArabic
? Positioned(
left: 20,
top: 12,
child: Opacity(
opacity: 0.25,
child: SvgPicture.asset(
"assets/images/new/Pharmacy.svg",
height: MediaQuery.of(context).size.width * 0.15,
),
),
)
: Positioned(
right: 20,
top: 12,
child: Opacity(
opacity: 0.25,
child: SvgPicture.asset(
"assets/images/new/Pharmacy.svg",
height: MediaQuery.of(context).size.width * 0.15,
),
),
),
Container(
width: double.infinity,
height: double.infinity,
padding: EdgeInsets.all(SizeConfig.widthMultiplier! * 3.4),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
child: SvgPicture.asset(
"assets/images/new/Pharmacy.svg",
height: MediaQuery.of(context).size.width * 0.08,
),
),
mFlex(1),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
TranslationBase.of(context).onlinePharmacy,
style: TextStyle(
color: Colors.black,
fontSize: 14,
fontWeight: FontWeight.bold,
letterSpacing: -0.45,
height: 1,
),
),
projectViewModel.isArabic ? mHeight(5) : Container(),
Text(
TranslationBase.of(context).ecommerceSolution,
style: TextStyle(
color: Colors.black,
fontSize: 9,
fontWeight: FontWeight.w600,
letterSpacing: -0.27,
height: projectViewModel.isArabic ? 0.2 : 1,
),
),
],
),
],
),
),
],
),
),
projectViewModel.havePrivilege(100)
? Container()
: Container(
width: double.infinity,
height: double.infinity,
clipBehavior: Clip.antiAlias,
decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor.withOpacity(0.7), darkColor: CustomColors.lightGreyColor.withOpacity(0.7)),
child: Icon(
Icons.lock_outline,
size: 40,
),
)
]),
),
);
}
// Widget offersButton() {
// final bypassPrivilageCheck = false;
// return Expanded(
// flex: 1,
// child: InkWell(
// onTap: () {
// // Navigator.of(context).push(MaterialPageRoute(builder: (context) => ErOptions(isAppbar: true)));
// Navigator.push(context, FadePage(page: ErOptions(isAppbar: true)));
// },
// child: Stack(
// children: [
// Container(
// width: double.infinity,
// height: double.infinity,
// clipBehavior: Clip.antiAlias,
// decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor),
// child: Stack(
// children: [
// Container(
// width: double.infinity,
// height: double.infinity,
// // color: Color(0xFF2B353E),
// decoration: containerRadius(CustomColors.accentColor, 20),
// ),
// Container(
// width: double.infinity,
// height: double.infinity,
// clipBehavior: Clip.antiAlias,
// decoration: projectViewModel.isArabic
// ? containerBottomRightRadiusWithGradientForAr(60, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor)
// : containerBottomRightRadiusWithGradient(60, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor),
// child: Stack(
// children: [
// SvgPicture.asset(
// "assets/images/new/strips.svg",
// width: double.infinity,
// height: double.infinity,
// fit: BoxFit.cover,
// ),
// ],
// ),
// ),
// projectViewModel.isArabic
// ? Positioned(
// left: 20,
// top: 12,
// child: Opacity(
// opacity: 0.5,
// child: SvgPicture.asset(
// "assets/images/new/emergency_services_back.svg",
// height: MediaQuery.of(context).size.width * 0.14,
// ),
// ),
// )
// : Positioned(
// right: 20,
// top: 12,
// child: Opacity(
// opacity: 0.5,
// child: SvgPicture.asset(
// "assets/images/new/emergency_services_back.svg",
// height: MediaQuery.of(context).size.width * 0.14,
// ),
// ),
// ),
// Container(
// width: double.infinity,
// height: double.infinity,
// padding: EdgeInsets.all(SizeConfig.widthMultiplier! * 3.4),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Container(
// child: SvgPicture.asset(
// "assets/images/new/emergency_services.svg",
// height: MediaQuery.of(context).size.width * 0.08,
// ),
// ),
// mFlex(1),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Text(
// TranslationBase.of(context).emergencyServices,
// style: TextStyle(
// color: Colors.black,
// fontSize: 14,
// fontWeight: FontWeight.bold,
// letterSpacing: -0.45,
// height: 1,
// ),
// ),
// projectViewModel.isArabic ? mHeight(5) : Container(),
// Text(
// TranslationBase.of(context).emergencyServicesSubtitle,
// style: TextStyle(
// color: Colors.black,
// fontSize: 9,
// fontWeight: FontWeight.w600,
// letterSpacing: -0.27,
// height: projectViewModel.isArabic ? 0.2 : 1,
// ),
// ),
// ],
// ),
// ],
// ),
// ),
// ],
// ),
// ),
// // projectViewModel.havePrivilege(82) || bypassPrivilageCheck
// // ? Container()
// // : Container(
// // width: double.infinity,
// // height: double.infinity,
// // clipBehavior: Clip.antiAlias,
// // decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor.withOpacity(0.7), darkColor: CustomColors.lightGreyColor.withOpacity(0.7)),
// // child: Icon(
// // Icons.lock_outline,
// // size: 40,
// // ),
// // )
// ],
// ),
// ),
// );
// }
//
// Widget hmgButton() {
// return Expanded(
// flex: 1,
// child: InkWell(
// onTap: () {
// if (projectViewModel.havePrivilege(100)) widget.onPharmacyClick!();
// },
// child: Stack(children: [
// Container(
// width: double.infinity,
// height: double.infinity,
// clipBehavior: Clip.antiAlias,
// decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor),
// child: Stack(
// children: [
// Container(
// width: double.infinity,
// height: double.infinity,
// // color: Color(0xFF2B353E),
// decoration: containerRadius(Color(0xFF359846), 20),
// ),
// Container(
// width: double.infinity,
// height: double.infinity,
// clipBehavior: Clip.antiAlias,
// decoration: projectViewModel.isArabic
// ? containerBottomRightRadiusWithGradientForAr(60, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor)
// : containerBottomRightRadiusWithGradient(60, lightColor: CustomColors.lightGreyColor, darkColor: CustomColors.lightGreyColor),
// child: Stack(
// children: [
// SvgPicture.asset(
// "assets/images/new/strips.svg",
// width: double.infinity,
// height: double.infinity,
// fit: BoxFit.cover,
// ),
// ],
// ),
// ),
// projectViewModel.isArabic
// ? Positioned(
// left: 20,
// top: 12,
// child: Opacity(
// opacity: 0.25,
// child: SvgPicture.asset(
// "assets/images/new/Pharmacy.svg",
// height: MediaQuery.of(context).size.width * 0.15,
// ),
// ),
// )
// : Positioned(
// right: 20,
// top: 12,
// child: Opacity(
// opacity: 0.25,
// child: SvgPicture.asset(
// "assets/images/new/Pharmacy.svg",
// height: MediaQuery.of(context).size.width * 0.15,
// ),
// ),
// ),
// Container(
// width: double.infinity,
// height: double.infinity,
// padding: EdgeInsets.all(SizeConfig.widthMultiplier! * 3.4),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Container(
// child: SvgPicture.asset(
// "assets/images/new/Pharmacy.svg",
// height: MediaQuery.of(context).size.width * 0.08,
// ),
// ),
// mFlex(1),
// Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Text(
// TranslationBase.of(context).onlinePharmacy,
// style: TextStyle(
// color: Colors.black,
// fontSize: 14,
// fontWeight: FontWeight.bold,
// letterSpacing: -0.45,
// height: 1,
// ),
// ),
// projectViewModel.isArabic ? mHeight(5) : Container(),
// Text(
// TranslationBase.of(context).ecommerceSolution,
// style: TextStyle(
// color: Colors.black,
// fontSize: 9,
// fontWeight: FontWeight.w600,
// letterSpacing: -0.27,
// height: projectViewModel.isArabic ? 0.2 : 1,
// ),
// ),
// ],
// ),
// ],
// ),
// ),
// ],
// ),
// ),
// projectViewModel.havePrivilege(100)
// ? Container()
// : Container(
// width: double.infinity,
// height: double.infinity,
// clipBehavior: Clip.antiAlias,
// decoration: containerRadiusWithGradientServices(20, lightColor: CustomColors.lightGreyColor.withOpacity(0.7), darkColor: CustomColors.lightGreyColor.withOpacity(0.7)),
// child: Icon(
// Icons.lock_outline,
// size: 40,
// ),
// )
// ]),
// ),
// );
// }
Widget getInpatientButton() {
return Container(

@ -41,6 +41,7 @@ import 'package:diplomaticquarterapp/uitl/penguin_method_channel.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/uitl/utils.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/vital_signs/result_screen.dart';
import 'package:diplomaticquarterapp/vital_signs/vital_sign.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/covid_consent_dialog.dart';
import 'package:diplomaticquarterapp/widgets/dialogs/location_selection_dialog.dart';
@ -50,6 +51,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:vital_sign_camera/vital_sign_camera.dart';
import '../../../locator.dart';
import '../landing_page_pharmcy.dart';
@ -229,17 +231,22 @@ class ServicesView extends StatelessWidget {
locator<GAnalytics>().hmgServices.logServiceName('book appointment');
} else if (hmgServices.action == 1) {
openLiveCare(context);
} else if (hmgServices.action == 111) {
Navigator.push(context, FadePage(page: VitalSigns()));
} else if (hmgServices.action == 2) {
//todo for temporary basis
Navigator.push(context, FadePage(page: VitalSigns()));
// Navigator.push(context, FadePage(page: ResultScreen(
// healthResult: Health(null, null, VitalSign(92,1, 1, null,null,null,null,null,null,null,null,null, null,null,null,null), null,null,),
// )));
// initPenguinSDK();
// if (projectViewModel.isIndoorNavigationEnabled) {
// if (!isLocked) openNavigationProjectSelection(context);
// } else {
// Navigator.push(context, FadePage(page: ErOptions(isAppbar: true)));
// locator<GAnalytics>().hmgServices.logServiceName('emergency service');
// }
if (projectViewModel.isIndoorNavigationEnabled) {
if (!isLocked) openNavigationProjectSelection(context);
} else {
Navigator.push(context, FadePage(page: ErOptions(isAppbar: true)));
locator<GAnalytics>().hmgServices.logServiceName('emergency service');
}
} else if (hmgServices.action == 3) {
Navigator.push(context, FadePage(page: HomeHealthCarePage()));
locator<GAnalytics>().hmgServices.logServiceName('home health care');

@ -3044,7 +3044,77 @@ class TranslationBase {
String get download => localizedValues["download"][locale.languageCode];
String get share => localizedValues["share"][locale.languageCode];
String get scanning => localizedValues["scanning"][locale.languageCode];
String get normal => localizedValues["normal"][locale.languageCode];
String get poor => localizedValues["poor"][locale.languageCode];
String get high => localizedValues["high"][locale.languageCode];
String get low => localizedValues["low"][locale.languageCode];
String get atRisk => localizedValues["atRisk"][locale.languageCode];
String get slightlyHigh => localizedValues["slightlyHigh"][locale.languageCode];
String get possiblyLow => localizedValues["possiblyLow"][locale.languageCode];
String get moderatelyHigh => localizedValues["moderatelyHigh"][locale.languageCode];
String get oxygenSaturation => localizedValues["oxygenSaturation"][locale.languageCode];
String get stress => localizedValues["stress"][locale.languageCode];
String get respiratoryRate => localizedValues["respiratoryRate"][locale.languageCode];
String get BMI => localizedValues["bmi"][locale.languageCode];
String get generalWellness => localizedValues["generalWellness"][locale.languageCode];
String get cvd => localizedValues["cvd"][locale.languageCode];
String get frameRate => localizedValues['frameRate'][locale.languageCode];
String get movement => localizedValues['movement'][locale.languageCode];
String get centered => localizedValues['centered'][locale.languageCode];
String get lighting => localizedValues['lighting'][locale.languageCode];
String get scanningConditions =>
localizedValues['scanningConditions'][locale.languageCode];
String get serverReady => localizedValues['serverReady'][locale.languageCode];
String get analyzingData =>
localizedValues['analyzingData']?[locale.languageCode] ?? '';
String get collectingData =>
localizedValues['collectingData']?[locale.languageCode] ?? '';
String get waitingData =>
localizedValues['waitingData']?[locale.languageCode] ?? '';
String get byFace => localizedValues['byFace']?[locale.languageCode] ?? '';
String getValue(String name) {
switch (name) {
case 'normal':
return normal;
case 'poor':
return poor;
case 'good':
return good;
case 'excellent':
return excellent;
case 'high':
return high;
case 'low':
return low;
case 'atRisk':
return atRisk;
case 'slightlyHigh':
return slightlyHigh;
case 'possiblyLow':
return possiblyLow;
case 'moderatelyHigh':
return moderatelyHigh;
case 'systolic-lng':
return systolicLng;
case 'diastolic-lng':
return diastolicLng;
default:
throw ArgumentError('Invalid name: $name');
}
}
}
class TranslationBaseDelegate extends LocalizationsDelegate<TranslationBase> {

@ -0,0 +1,28 @@
import 'package:flutter/material.dart';
class BackHomeButton extends StatelessWidget {
final void Function() onPressed;
final Size deviceSize;
const BackHomeButton({
Key? key,
required this.onPressed,
required this.deviceSize,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.topLeft,
child: Container(
margin: EdgeInsets.fromLTRB(15, deviceSize.height * 0.05, 0, 0),
child: IconButton(
icon: const Icon(Icons.arrow_back),
color: Colors.white,
iconSize: 25,
onPressed: onPressed,
),
),
);
}
}

@ -0,0 +1,87 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:vital_sign_camera/vital_sign_camera.dart';
class BoundingBoxWidget extends StatelessWidget {
final Size deviceSize;
final NormalizedFaceBox? facebox;
final VideoFrameInfo? videoFrameInfo;
const BoundingBoxWidget({
Key? key,
required this.deviceSize,
required this.facebox,
required this.videoFrameInfo,
}) : super(key: key);
@override
Widget build(BuildContext context) {
if (facebox == null || videoFrameInfo == null) {
return Container();
}
// Get a map with left, top, width, and height of the bounding box for the face
Map boundingBox = computeBoundingBox();
return Positioned(
left: boundingBox['left'],
top: boundingBox['top'],
child: Container(
width: boundingBox['width'],
height: boundingBox['height'],
decoration: BoxDecoration(
border: Border.all(
color: Colors.red,
width: 2,
)),
),
);
}
// Helper function to compute the left, top, width, and height of the bounding box
Map computeBoundingBox() {
double width = videoFrameInfo!.width;
double height = videoFrameInfo!.height;
double windowWidth = deviceSize.width;
double windowHeight = deviceSize.height;
double screenAspectRatio = deviceSize.aspectRatio;
double frameAspectRatio = width / height;
int xTransform = 1;
if (Platform.isAndroid) {
xTransform = -1;
}
double scale = 1;
if (screenAspectRatio < frameAspectRatio) {
scale = windowHeight / height;
} else {
scale = windowWidth / width;
}
Map scaledFrameBounds = {
'x': (windowWidth - scale * width) / 2,
'y': (windowHeight - scale * height) / 2,
'width': scale * width,
'height': scale * height,
};
double x = facebox!.xCenter - facebox!.width / 2;
double y = facebox!.yCenter - facebox!.height / 2;
if (xTransform < 0) {
x = 1 - x - facebox!.width;
}
Map result = {
'left': scaledFrameBounds['x'] + x * scaledFrameBounds['width'],
'top': scaledFrameBounds['y'] + y * scaledFrameBounds['height'],
'width': facebox!.width * scaledFrameBounds['width'],
'height': facebox!.height * scaledFrameBounds['height'],
};
return result;
}
}

@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
class Button extends StatelessWidget {
final void Function() onPressed;
final Size deviceSize;
final String title;
final Alignment alignment;
final EdgeInsets margin;
const Button({
Key? key,
required this.onPressed,
required this.deviceSize,
required this.title,
required this.alignment,
required this.margin,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Align(
alignment: alignment,
child: Container(
margin: margin,
child: ElevatedButton(
onPressed: onPressed,
child: Text(
title,
style: const TextStyle(fontSize: 18),
),
),
));
}
}

@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
class Error extends StatelessWidget {
final dynamic error;
final int? errorCode;
const Error({
Key? key,
this.error,
this.errorCode,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: Text(
"$error $errorCode",
style: const TextStyle(color: Colors.white),
textAlign: TextAlign.center,
),
);
}
}

@ -0,0 +1,222 @@
// import 'package:flutter/material.dart';
// import 'package:vital_sign_camera/vital_sign_camera.dart';
// import 'vital_sign_widget.dart';
//
// class HealthResultWidget extends StatelessWidget {
// final Size deviceSize;
// final void Function() onTap;
// final Health? healthResult;
//
// late final VitalSign? _vitalSign;
// late final HolisticAnalysis? _holisticAnalysis;
// late final CardiovascularRisks? _cardiovascularRisks;
// late final CovidRisk? _covidRisk;
// late final ScanParameters? _scanParameters;
//
// HealthResultWidget({
// Key? key,
// required this.deviceSize,
// required this.onTap,
// required this.healthResult,
// }) : super(key: key) {
// _vitalSign = healthResult?.vitalSigns;
// _holisticAnalysis = healthResult?.holisticHealth;
// _cardiovascularRisks = healthResult?.risks?.cardiovascularRisks;
// _covidRisk = healthResult?.risks?.covidRisk;
// _scanParameters = healthResult?.scanParameters;
// }
//
// @override
// Widget build(BuildContext context) {
// return Positioned(
// top: deviceSize.height * 0.07,
// left: deviceSize.width * 0.05,
// child: GestureDetector(
// onTap: onTap,
// child: SizedBox(
// width: deviceSize.width * 0.9,
// child: Container(
// color: Colors.black38,
// child: Padding(
// padding: const EdgeInsets.all(15),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Container(
// margin: const EdgeInsets.fromLTRB(0, 0, 0, 10),
// child: const Text(
// "Vital Signs",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// VitalSignWidget(
// vitalSignName: "Heart Rate",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.heartRate)),
// VitalSignWidget(
// vitalSignName: "SPO2",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.spo2)),
// VitalSignWidget(
// vitalSignName: "IBI",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.ibi)),
// if (_vitalSign?.stress != null)
// VitalSignWidget(
// vitalSignName: "Stress",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.stress)),
// if (_vitalSign?.respiratoryRate != null)
// VitalSignWidget(
// vitalSignName: "Respiratory Rate",
// vitalSignValue: formatValueToTwoDp(
// healthResult
// ?.vitalSigns.respiratoryRate)),
// if (_vitalSign?.hrvRmssd != null)
// VitalSignWidget(
// vitalSignName: "HRV RMSSD",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.hrvRmssd)),
// if (_vitalSign?.hrvSdnn != null)
// VitalSignWidget(
// vitalSignName: "HRV SDNN",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.hrvSdnn)),
// if (_vitalSign?.temperature != null)
// VitalSignWidget(
// vitalSignName: "Temperature",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.temperature)),
// if (_vitalSign?.bloodPressure != null)
// VitalSignWidget(
// vitalSignName: "Blood Pressure",
// vitalSignValue:
// healthResult?.vitalSigns.bloodPressure ??
// ""),
// if (_vitalSign?.bloodPressureSystolic != null)
// VitalSignWidget(
// vitalSignName: "Blood Pressure Systolic",
// vitalSignValue: formatValueToTwoDp(
// healthResult
// ?.vitalSigns.bloodPressureSystolic)),
// if (_vitalSign?.bloodPressureDiastolic != null)
// VitalSignWidget(
// vitalSignName: "Blood Pressure Diastolic",
// vitalSignValue: formatValueToTwoDp(
// healthResult
// ?.vitalSigns.bloodPressureDiastolic)),
// if (_holisticAnalysis != null)
// Container(
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
// child: const Text(
// "Holistic Analysis",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// if (_holisticAnalysis != null &&
// _holisticAnalysis?.bmi != null)
// VitalSignWidget(
// vitalSignName: "BMI",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.holisticHealth?.bmi)),
// if (_holisticAnalysis != null &&
// _holisticAnalysis?.generalWellness != null)
// VitalSignWidget(
// vitalSignName: "General Wellness",
// vitalSignValue: formatValueToTwoDp(
// healthResult
// ?.holisticHealth?.generalWellness)),
// if (_cardiovascularRisks != null)
// Container(
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
// child: const Text(
// "Cardiovascular Risks",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// vitalSignName: "General",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.risks?.cardiovascularRisks
// ?.generalRisk)),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// vitalSignName: "Congestive Heart Failure",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.risks?.cardiovascularRisks
// ?.congestiveHeartFailure)),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// vitalSignName: "Coronary Heart Disease",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.risks?.cardiovascularRisks
// ?.coronaryHeartDisease)),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// vitalSignName: "Intermittent Claudication",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.risks?.cardiovascularRisks
// ?.intermittentClaudication)),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// vitalSignName: "Stroke",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.risks?.cardiovascularRisks
// ?.stroke)),
// if (_covidRisk != null)
// Container(
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
// child: const Text(
// "Covid Risks",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// if (_covidRisk != null)
// VitalSignWidget(
// vitalSignName: "Risk",
// vitalSignValue: formatValueToTwoDp(
// healthResult
// ?.risks?.covidRisk?.covidRisk)),
// if (_scanParameters != null)
// Container(
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
// child: const Text(
// "Scan Parameters",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// if (_scanParameters != null)
// VitalSignWidget(
// vitalSignName: "Signal Quality",
// vitalSignValue: formatValueToTwoDp(
// healthResult
// ?.scanParameters?.signalQuality)),
// ])))),
// ));
// }
//
// String formatValueToTwoDp(double? value) {
// return (value != null) ? value.toStringAsFixed(2) : "";
// }
// }

@ -0,0 +1,37 @@
import 'package:flutter/material.dart';
class ScanCondition extends StatelessWidget {
final String scanConditionName;
final bool isConditionSatisfied;
const ScanCondition({
Key? key,
required this.scanConditionName, // condition
required this.isConditionSatisfied, // status
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.fromLTRB(0, 5, 0, 0),
child: Row(
children: [
(isConditionSatisfied)
? Image.asset('assets/images/checkmark.png', width: 14)
: Image.asset('assets/images/crossmark.png', width: 14),
Padding(
padding: const EdgeInsets.fromLTRB(5, 0, 0, 0),
child: Text(
scanConditionName,
style: const TextStyle(
fontSize: 14,
color: Colors.black,
fontWeight: FontWeight.bold,
),
),
),
],
),
);
}
}

@ -0,0 +1,95 @@
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:vital_sign_camera/vital_sign_camera.dart';
import 'scan_condition.dart';
class ScanConditionChecklist extends StatelessWidget {
final ScanConditions conditions; // ScanCondition
const ScanConditionChecklist({
Key? key,
required this.deviceSize,
required this.conditions, // ScanCondition
}) : super(key: key);
final Size deviceSize;
@override
Widget build(BuildContext context) {
return SizedBox(
height: deviceSize.width * 0.4,
child: Material(
color:Colors.white,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
TranslationBase.of(context).scanningConditions,
style: TextStyle(
fontSize: 15,
color: CustomColors.accentColor,
fontWeight: FontWeight.bold,
),
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 10, 0, 0),
child: Row(
children: [
Expanded(
child: Column(
children: [
ScanCondition(
scanConditionName:
TranslationBase.of(context).lighting,
isConditionSatisfied: conditions.lighting,
),
ScanCondition(
scanConditionName:
TranslationBase.of(context).distance,
isConditionSatisfied: conditions.distance,
),
ScanCondition(
scanConditionName:
TranslationBase.of(context).centered,
isConditionSatisfied: conditions.centered,
),
],
),
),
Expanded(
child: Column(
children: [
ScanCondition(
scanConditionName:
TranslationBase.of(context).movement,
isConditionSatisfied: conditions.movement,
),
ScanCondition(
scanConditionName:
TranslationBase.of(context).frameRate,
isConditionSatisfied: conditions.frameRate,
),
ScanCondition(
scanConditionName:
TranslationBase.of(context).serverReady,
isConditionSatisfied: conditions.serverReady,
),
],
),
),
],
),
),
],
),
),
),
);
}
}

@ -0,0 +1,57 @@
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:vital_sign_camera/vital_sign_camera.dart';
class ScanStatus extends StatelessWidget {
final GetHealthStage? stage;
final double? remainingTime;
const ScanStatus({
Key? key,
required this.stage,
required this.remainingTime,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
getRemainingTime(),
style: const TextStyle(
fontSize: 16,
color: Colors.white,
),
),
Text(
getScanStage(context),
style: const TextStyle(
fontSize: 16,
color: Colors.white,
),
),
Container(height: 100),
],
),
);
}
String getScanStage(context) {
if (stage == GetHealthStage.waitingData) {
return TranslationBase.of(context).waitingData;
} else if (stage == GetHealthStage.collectingData) {
return TranslationBase.of(context).collectingData;
} else if (stage == GetHealthStage.analyzingData) {
return TranslationBase.of(context).analyzingData;
}
return ''; // idle
}
String getRemainingTime() {
return (remainingTime != null && remainingTime != double.infinity)
? remainingTime!.toStringAsFixed(0)
: "";
}
}

@ -0,0 +1,39 @@
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
class StartButton extends StatelessWidget {
final void Function() onPressed;
final bool disabled;
const StartButton({
Key? key,
required this.onPressed,
required this.disabled,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.bottomRight,
child: Padding(
padding: const EdgeInsets.only(right: 16.0, bottom: 32),
child: ElevatedButton(
onPressed: (disabled) ? () {} : onPressed,
style: ElevatedButton.styleFrom(
fixedSize: const Size(100, 70),
shape: const CircleBorder(),
backgroundColor: (disabled) ? Colors.grey : CustomColors.accentColor,
elevation: 8,
),
child: Text(
TranslationBase.of(context).start,
style: TextStyle(
fontSize: 14,
),
),
),
),
);
}
}

@ -0,0 +1,354 @@
import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
class VitalSignWidget extends StatelessWidget {
final String vitalSignName;
final String vitalSignValue;
final String vectorUrl;
final dynamic condition;
final Map<String, dynamic>? lookupValues;
final Map<String, dynamic>? bloodPressureValues;
final Color? textColor;
const VitalSignWidget({
Key? key,
required this.vitalSignName,
required this.vitalSignValue,
this.textColor,
required this.condition,
required this.vectorUrl,
this.lookupValues,
this.bloodPressureValues,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
color: Colors.white,
elevation: 2,
shadowColor: CustomColors.lightGreyColor,
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Row(
children: [
SvgPicture.asset(vectorUrl, width: 36.0, height: 36.0),
SizedBox(
width: 16,
),
Text(
vitalSignName,
textAlign: TextAlign.start,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w600,
color: textColor ?? Colors.white,
),
),
],
),
SizedBox(
height: 8,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
"$vitalSignValue ${condition.unit}",
style: TextStyle(
fontSize: 14,
color: textColor ?? Colors.white,
fontWeight: FontWeight.w500,
),
),
SizedBox(
width: 8,
),
if (lookupValues != null)
Status(
status:
"${TranslationBase.of(context).getValue(condition.current?.quantitativeInterpretation ?? '')}",
originalData:
condition.current?.quantitativeInterpretation ?? '',
)
// Text(
// "${TranslationBase.of(context).getValue(condition.current?.quantitativeInterpretation ?? '')}",
// style: TextStyle(
// fontSize: 14,
// color: textColor ?? Colors.white,
// fontWeight: FontWeight.w500,
// ),
// ),
],
),
SizedBox(
height: 8,
),
// SizedBox(
// height: 30,
// child: Row(mainAxisSize: MainAxisSize.max, children: [
if (lookupValues != null)
Flexible(
flex: 1,
child: ListView.separated(
physics: NeverScrollableScrollPhysics(),
separatorBuilder: (_, __) => SizedBox(
width: 8,
),
shrinkWrap: true,
itemCount: lookupValues?.length ?? 0,
itemBuilder: (_, index) {
var key = lookupValues?.keys.elementAt(index);
return RangeWidget(
title: key ?? '',
values: lookupValues?[key] ?? [],
isSelected: false,
);
}),
),
if (bloodPressureValues != null)
Flexible(
flex: 1,
child: ListView.separated(
separatorBuilder: (_, __) => SizedBox(
width: 8,
),
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: bloodPressureValues?.length ?? 0,
itemBuilder: (_, index) {
var key = bloodPressureValues?.keys.elementAt(index);
print(
'the ssize is ${(bloodPressureValues?[key]?.length ?? 1) * 40} ');
// return RangeWidget(
// title: key??'',
// values: lookupValues?[key]??[],isSelected: false,
// );
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
TranslationBase.of(context)
.getValue(key ?? ''),
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.black, fontSize: 16),
),
Status(
status:
"${TranslationBase.of(context).getValue(condition.getValue(key)?.quantitativeInterpretation ?? '')}",
originalData: condition
.getValue(key)
?.quantitativeInterpretation ??
'',
)
],
),
SizedBox(height: 8),
SizedBox(
height: 220,
child: ListView.separated(
separatorBuilder: (_, __) => SizedBox(
width: 8,
),
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount:
bloodPressureValues?[key]?.length ?? 0,
itemBuilder: (_, index) {
var title = bloodPressureValues?[key]
?.keys
.elementAt(index);
return RangeWidget(
title: title ?? '',
values: bloodPressureValues?[key]
?[title] ??
[],
isSelected: false,
);
}))
],
);
}),
),
// ]),
// ),
SizedBox(
height: 8,
),
// Row(
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
// children: [
// Text(
// TranslationBase.of(context).getValue(
// condition.condition?.first.interpretation ?? ''),
// style: TextStyle(
// fontSize: 14,
// color: textColor ?? Colors.white,
// fontWeight: FontWeight.w500,
// ),
// ),
// Text(
// TranslationBase.of(context).getValue(
// condition.condition?.last.interpretation ?? ''),
// style: TextStyle(
// fontSize: 14,
// color: textColor ?? Colors.white,
// fontWeight: FontWeight.w500,
// ),
// ),
// ],
// ),
// SizedBox(
// height: 8,
// ),
]),
),
);
}
}
class RangeWidget extends StatelessWidget {
final String title;
final List<String> values;
final bool isSelected;
const RangeWidget(
{super.key,
required this.title,
required this.isSelected,
required this.values});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: [
SizedBox(
height: 30,
child: Material(
shape: RoundedRectangleBorder(
borderRadius: BorderRadiusDirectional.only(
topStart: Radius.circular(8),
bottomStart: Radius.circular(8),
),
),
// color: Color(0xFF359846),
color: CustomColors.lightGreyColor,
child: Padding(
padding: const EdgeInsets.only(
top: 4.0, bottom: 4, right: 8, left: 8),
child: Text(
TranslationBase.of(context).getValue(title),
textAlign: TextAlign.center,
style: TextStyle(color: Colors.black, fontSize: 12),
),
),
),
),
Expanded(
child: Material(
shape: RoundedRectangleBorder(
borderRadius: BorderRadiusDirectional.only(
topEnd: Radius.circular(8),
bottomEnd: Radius.circular(8),
),
),
// color: Color(0xFF359846),
color: getColor(title),
child: SizedBox(
height: 30,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
children: List.generate(
values.length,
(index) => Row(
children: [
Text(
values[index],
textAlign: TextAlign.center,
style:
TextStyle(color: Colors.white, fontSize: 12),
),
SizedBox(
width: 8,
)
],
),
),
),
),
)),
)
],
),
);
}
getColor(title) {
switch (title) {
case "excellent":
return Color(0xFF275b45);
case "good":
return Color(0xFF507a3d);
case "poor":
return Color(0xFFa86452);
case "atRisk":
return Color(0xFFa2494b);
}
}
}
class Status extends StatelessWidget {
final String status;
final String originalData;
const Status({super.key, required this.status, required this.originalData});
@override
Widget build(BuildContext context) {
return Material(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(3),
),
// color: Color(0xFF359846),
color: (originalData.toLowerCase() == 'good' ||
originalData.toLowerCase() == 'excellent' ||
originalData.toLowerCase() == 'normal')
? Color(0xFFD8E8DB)
: (originalData.toLowerCase() == 'poor' ||
originalData.toLowerCase() == 'low')
? Color(0xFFD3D37E)
: Color(0x98d02127),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
child: Text(status,
style: TextStyle(
color: (originalData.toLowerCase() == 'good' ||
originalData.toLowerCase() == 'excellent' ||
originalData.toLowerCase() == 'normal')
? Color(0xFF359846)
: (originalData.toLowerCase() == 'poor' ||
originalData.toLowerCase() == 'low')
? Colors.white
: Colors.white,
fontSize: 8,
fontWeight: FontWeight.w600,
)),
));
}
}

@ -0,0 +1,550 @@
var vital = {
"HR": {
"unit": "bpm",
"values": [
{
"min": 0,
"max": 60,
"interpretation": "atRisk",
"quantitativeInterpretation": "low",
"title": "< 60"
},
{
"min": 80,
"max": 100,
"interpretation": "poor",
"quantitativeInterpretation": "normal",
"title": "80-100"
},
{
"min": 60,
"max": 80,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "60-80"
},
{
"min": 100,
"max": 0,
"interpretation": "atRisk",
"quantitativeInterpretation": "high",
"title": "≥ 100"
},
]
},"hrvv": {
"unit": "ms",
"values":[
{
"min": 0,
"max": 10.8,
"interpretation": "atRisk",
"quantitativeInterpretation": "low",
"title": "< 10.8"
},
{
"min": 10.8,
"max": 35.0,
"interpretation": "poor",
"quantitativeInterpretation": "low",
"title": "10.8-16.4"
},
{
"min": 35.0,
"max": 51.5,
"interpretation": "good",
"quantitativeInterpretation": "normal",
"title": "35.0-51.5"
},
{
"min": 51.5,
"max": 0,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "≥ 51.5"
}
]
},
"Sp02": {
"unit": "%",
"values": [
{
"min": 0,
"max": 90,
"interpretation": "atRisk",
"quantitativeInterpretation": "low",
"title": "≥ 90"
},
{
"min": 90,
"max": 95,
"interpretation": "poor",
"quantitativeInterpretation": "possiblyLow",
"title": "90-95"
},
{
"min": 95,
"max": 97,
"interpretation": "good",
"quantitativeInterpretation": "normal",
"title": "95-97"
},
{
"min": 97,
"max": 100,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"isMaxIncluded": true,
"title": "97-100"
}
]
},
"blood_pressure": {
"unit": "mmHg",
"values": [
{
"systolic-lng": {
"min": 0,
"max": 90,
"interpretation": "atRisk",
"quantitativeInterpretation": "low",
"title": "0-90",
"heading": "systolic-lng"
},
"diastolic-lng": {
"min": 0,
"max": 60,
"interpretation": "atRisk",
"quantitativeInterpretation": "low",
"title": "0-60",
"heading": "diastolic-lng"
}
},
{
"systolic-lng": {
"min": 90,
"max": 120,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "90-120",
"heading": "systolic-lng"
},
"diastolic-lng": {
"min": 60,
"max": 70,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "60-70",
"heading": "diastolic-lng"
}
},
{
"systolic-lng": {
"min": 120,
"max": 130,
"interpretation": "good",
"quantitativeInterpretation": "normal",
"title": "120-130",
"heading": "systolic-lng"
},
"diastolic-lng": {
"min": 70,
"max": 80,
"interpretation": "good",
"quantitativeInterpretation": "normal",
"title": "70-80",
"heading": "diastolic-lng"
}
},
{
"systolic-lng": {
"min": 130,
"max": 140,
"interpretation": "poor",
"quantitativeInterpretation": "slightlyHigh",
"title": "130-140",
"heading": "systolic-lng"
},
"diastolic-lng": {
"min": 80,
"max": 90,
"interpretation": "poor",
"quantitativeInterpretation": "normal",
"title": "80-90",
"heading": "diastolic-lng"
}
},
{
"systolic-lng": {
"min": 140,
"max": 0,
"interpretation": "atRisk",
"quantitativeInterpretation": "high",
"title": "140-200",
"heading": "systolic-lng"
},
"diastolic-lng": {
"min": 90,
"max": 200,
"interpretation": "atRisk",
"quantitativeInterpretation": "high",
"title": "≥ 90",
"heading": "diastolic-lng"
}
}
]
},
"bmi": {
"unit": "",
"values": [
{
"min": 0,
"max": 18.5,
"interpretation": "poor",
"quantitativeInterpretation": "normal",
"title": "< 18.5"
},
{
"min": 18.5,
"max": 25,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "25-30"
},{
"min": 25,
"max": 30,
"interpretation": "poor",
"quantitativeInterpretation": "normal",
"title": "25-30"
},
{
"min": 30,
"max": 40,
"interpretation": "atRisk",
"quantitativeInterpretation": "high",
"title": "30-40"
},
{
"min": 40,
"max": 0,
"interpretation": "atRisk",
"quantitativeInterpretation": "high",
"title": "≥40"
},
]
},
"respiratoryRate": {
"unit": "bpm",
"values": [
{
"min": 0,
"max": 12,
"interpretation": "poor",
"quantitativeInterpretation": "low",
"title": "< 12"
},
{
"min": 12,
"max": 20,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "25-30"
},
{
"min": 20,
"max": 0,
"interpretation": "poor",
"quantitativeInterpretation": "high",
"title": "≥ 20"
},
]
},
"cvd": {
"unit": "%",
"values": [
{
"min": 0,
"max": 1,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "< 1"
},
{
"min": 1,
"max": 10,
"interpretation": "Average",
"quantitativeInterpretation": "slightlyHigh",
"title": "1-10"
},
{
"min": 10,
"max": 20,
"interpretation": "poor",
"quantitativeInterpretation": "moderatelyHigh",
"title": "10-20"
},
{
"min": 20,
"max": 0,
"interpretation": "atRisk",
"quantitativeInterpretation": " high",
"title": "≥ 20"
},
]
},
"generalWellness": {
"unit": "",
"values": [
{
"min": 0,
"max": 40,
"interpretation": "poor",
"quantitativeInterpretation": "low",
"title": "< 40"
},
{
"min": 40,
"max": 80,
"interpretation": "good",
"quantitativeInterpretation": "normal",
"title": "40-80"
},
{
"min": 80,
"max": 100,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "80-100",
"isMaxIncluded": true
},
]
},
"stressLevel": {
"unit": "",
"values": [
{
"min": 0,
"max": 2,
"interpretation": "excellent",
"quantitativeInterpretation": "normal",
"title": "0-2"
},
{
"min": 2,
"max": 3,
"interpretation": "good",
"quantitativeInterpretation": "normal",
"title": "2-3"
},
{
"min": 3,
"max": 0,
"interpretation": "poor",
"quantitativeInterpretation": "high",
"title": "80-100",
},
]
},
};
var vitalValues = {
"HR": {
"excellent": ["60-80"],
"poor": ["80-100"],
"atRisk": ["< 60", "≥ 100"]
},
"hrvv": {
"excellent": ["≥ 51.5"],
"good": ["35.0-51.5"],
"poor": ["10.8-16.4"],
"atRisk": ["< 10.8"]
},
"Sp02": {
"excellent": ["97-100"],
"good": ["95-97"],
"poor": ["90-95"],
"atRisk": ["≥ 90"]
},
"blood_pressure": {
"systolic-lng": {
"excellent": ["90-120"],
"good": ["120-130"],
"poor": ["130-140"],
"atRisk": ["0-90", "140-200"]
},
"diastolic-lng": {
"excellent": ["60-70"],
"good": ["70-80"],
"poor": ["80-90"],
"atRisk": ["0-60", "≥ 90"]
}
},
// "bmi": {
// "unit": "",
// "values": [
// {
// "min": 0,
// "max": 18.5,
// "interpretation": "poor",
// "quantitativeInterpretation": "normal",
// "title": "< 18.5"
// },
// {
// "min": 18.5,
// "max": 25,
// "interpretation": "excellent",
// "quantitativeInterpretation": "normal",
// "title": "25-30"
// },{
// "min": 25,
// "max": 30,
// "interpretation": "poor",
// "quantitativeInterpretation": "normal",
// "title": "25-30"
// },
// {
// "min": 30,
// "max": 40,
// "interpretation": "atRisk",
// "quantitativeInterpretation": "high",
// "title": "30-40"
// },
// {
// "min": 40,
// "max": 0,
// "interpretation": "atRisk",
// "quantitativeInterpretation": "high",
// "title": "≥40"
// },
// ]
"bmi": {
"excellent": ["18.5-25"],
"poor": ["< 18.5", "25-30"],
"atRisk": ["30-40", "≥40"],
},
"respiratoryRate": {
"excellent": ["25-30"],
"poor": ["< 12", "≥ 20"]
},
"cvd": {
"excellent": ["< 1"],
"Average": ["1-10"],
"poor": ["10-20"],
"atRisk": ["≥ 20"]
},
"generalWellness": {
"excellent": ["80-100"],
"good": ["40-80"],
"poor": ["< 40"]
},
"stressLevel": {
"excellent": ["0-2"],
"good": ["2-3"],
"poor": ["80-100"]
}
};
class RangeConditionWithTitle {
String? unit;
List<RangeCondition>? condition;
RangeCondition? current;
RangeConditionWithTitle({this.unit, this.condition});
RangeConditionWithTitle.fromJson(Map<String, dynamic> json, String formatValueToTwoDp) {
this.unit = json['unit'];
var conditions = json['values'] as List?;
this.condition =
conditions?.map((item) => RangeCondition.fromJson(item,formatValueToTwoDp)).toList();
print("the value is $formatValueToTwoDp");
current = condition?.where((element)=>element.isSelected == true).first;
}
}
class RangeConditionForBloodPressure {
String? unit;
List<BloodPressure>? condition;
BloodPressure? systolic;
BloodPressure? diastolic;
RangeCondition? getValue(String key) {
switch (key) {
case 'systolic-lng':
return systolic?.systolic;
case 'diastolic-lng':
return diastolic?.diastolic;
}
}
RangeConditionForBloodPressure({this.unit, this.condition});
RangeConditionForBloodPressure.fromJson(
Map<String, dynamic> json, String formatValueToTwoDp) {
this.unit = json['unit'];
var conditions = json['values'] as List?;
this.condition = conditions
?.map((item) => BloodPressure.fromJson(item, formatValueToTwoDp))
.toList();
print("the value is $formatValueToTwoDp");
systolic = condition
?.where((element) => element.systolic?.isSelected == true)
.first;
diastolic = condition
?.where((element) => element.diastolic?.isSelected == true)
.first;
}
}
class BloodPressure {
RangeCondition? systolic;
RangeCondition? diastolic;
BloodPressure.fromJson(Map<String, dynamic> json, String selectedValue) {
systolic = RangeCondition.fromJson(
json['systolic-lng'], selectedValue.split("/")[0]);
diastolic = RangeCondition.fromJson(
json['diastolic-lng'], selectedValue.split("/")[1]);
}
}
class RangeCondition {
String? heading;
double? min;
double? max;
bool? isMaxIncluded;
String? interpretation;
String? quantitativeInterpretation;
String? title;
bool? isSelected;
RangeCondition(this.min, this.max, this.interpretation,
this.quantitativeInterpretation, this.isMaxIncluded);
RangeCondition.fromJson(Map<String, dynamic> json, String selectedValue) {
min = json['min'].toDouble();
max = json['max'].toDouble();
interpretation = json['interpretation'];
quantitativeInterpretation = json['quantitativeInterpretation'];
isMaxIncluded = json['isMaxIncluded'];
title = json['title'];
isSelected = isInRange(selectedValue);
heading = json['heading'];
}
bool isInRange(String data) {
double value = 0.0;
if(data.contains('/')){
value = double.parse(data.split("/")[0])/double.parse(data.split("/")[1]);
print("the blood pressure is ${value}");
}else{
value = double.parse(data);
}
if (max == 0 && min != 0) return value >= min!;
if (min == 0 && max != 0) return value < max!;
if (isMaxIncluded == true) return value >= min! && value <= max!;
return value >= min! && value < max!;
}
}

@ -0,0 +1,332 @@
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/vital_signs/data/vitals_benchmark.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:vital_sign_camera/vital_sign_camera.dart';
import 'components/vital_sign_widget.dart';
class ResultScreen extends StatelessWidget {
final Health? healthResult;
late final VitalSign? _vitalSign;
late final HolisticAnalysis? _holisticAnalysis;
late final CardiovascularRisks? _cardiovascularRisks;
late final CovidRisk? _covidRisk;
late final ScanParameters? _scanParameters;
ResultScreen({
Key? key,
required this.healthResult,
}) : super(key: key) {
_vitalSign = healthResult?.vitalSigns;
_holisticAnalysis = healthResult?.holisticHealth;
_cardiovascularRisks = healthResult?.risks?.cardiovascularRisks;
_covidRisk = healthResult?.risks?.covidRisk;
_scanParameters = healthResult?.scanParameters;
}
@override
Widget build(BuildContext context) {
final deviceSize = MediaQuery.of(context).size;
const textColor = Color.fromARGB(255, 0, 0, 0);
print('the age is ${healthResult?.vitalSigns?.facialSkinAge}');
return AppScaffold(
isShowAppBar: true,
appBarTitle: TranslationBase.of(context).result,
showNewAppBar: true,
showNewAppBarTitle: true,
overrideUserLogin: true,
backgroundColor: Color(0xffF8F8F8),
body: Padding(
padding: const EdgeInsets.all(15),
child: ListView(
shrinkWrap: true,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (_holisticAnalysis != null &&
_holisticAnalysis?.generalWellness != null)
VitalSignWidget(
textColor: textColor,
lookupValues: vitalValues['generalWellness']!,
vitalSignName:
TranslationBase.of(context).generalWellness,
condition: RangeConditionWithTitle.fromJson(
vital['generalWellness']!,
formatValueToTwoDp(
healthResult?.holisticHealth?.generalWellness)),
vitalSignValue: formatValueToTwoDp(
healthResult?.holisticHealth?.generalWellness),
vectorUrl: 'assets/images/svg/wellness.svg',
),//wellness
if (_vitalSign?.stress != null)
VitalSignWidget(
textColor: textColor,
vitalSignName: TranslationBase.of(context).stress,
condition: RangeConditionWithTitle.fromJson(
vital['stressLevel']!,
formatValueToTwoDp(
healthResult?.vitalSigns.stress)),
lookupValues: vitalValues['stressLevel']!,
vitalSignValue:
formatValueToTwoDp(healthResult?.vitalSigns.stress),
vectorUrl: 'assets/images/svg/stress.svg',
),
VitalSignWidget(
textColor: textColor,
vitalSignName: TranslationBase.of(context).pulseTitle,
condition: RangeConditionWithTitle.fromJson(
vital['HR']!,
formatValueToTwoDp(
healthResult?.vitalSigns.heartRate)),
lookupValues: vitalValues['HR']!,
vitalSignValue: formatValueToTwoDp(
healthResult?.vitalSigns.heartRate),
vectorUrl: 'assets/images/svg/heartrate.svg',
),
//heart rate
if (_vitalSign?.bloodPressure != null)
VitalSignWidget(
textColor: textColor,
vitalSignName: "Blood Pressure",
condition: RangeConditionForBloodPressure.fromJson(
vital['blood_pressure']!,
healthResult?.vitalSigns.bloodPressure ?? ""),
bloodPressureValues: vitalValues['blood_pressure']!,
vitalSignValue:
healthResult?.vitalSigns.bloodPressure ?? "",
vectorUrl: 'assets/images/svg/bloodpressure.svg',
),
if (_vitalSign?.hrvSdnn != null)
VitalSignWidget(
vectorUrl: 'assets/images/svg/heartrate.svg',
textColor: textColor,
vitalSignName: "HRV SDNN",
lookupValues: vitalValues['hrvv']!,
condition: RangeConditionWithTitle.fromJson(
vital['hrvv']!,
formatValueToTwoDp(
healthResult?.vitalSigns.hrvSdnn)),
vitalSignValue: formatValueToTwoDp(
healthResult?.vitalSigns.hrvSdnn)),
//oxygen
VitalSignWidget(
textColor: textColor,
lookupValues: vitalValues['Sp02']!,
vitalSignName:
TranslationBase.of(context).oxygenSaturation,
condition: RangeConditionWithTitle.fromJson(
vital['Sp02']!,
formatValueToTwoDp(healthResult?.vitalSigns.spo2)),
vitalSignValue:
formatValueToTwoDp(healthResult?.vitalSigns.spo2),
vectorUrl: 'assets/images/svg/oxygen.svg',
),
if (_vitalSign?.respiratoryRate != null)
VitalSignWidget(
textColor: textColor,
lookupValues: vitalValues['respiratoryRate']!,
vitalSignName:
TranslationBase.of(context).respiratoryRate,
condition: RangeConditionWithTitle.fromJson(
vital['respiratoryRate']!,
formatValueToTwoDp(
healthResult?.vitalSigns.respiratoryRate)),
vitalSignValue: formatValueToTwoDp(
healthResult?.vitalSigns.respiratoryRate),
vectorUrl: 'assets/images/svg/breathing.svg',
),
if (_holisticAnalysis != null &&
_holisticAnalysis?.bmi != null)
VitalSignWidget(
textColor: textColor,
lookupValues: vitalValues['bmi']!,
vitalSignName: TranslationBase.of(context).BMI,
condition: RangeConditionWithTitle.fromJson(
vital['bmi']!,
formatValueToTwoDp(
healthResult?.holisticHealth?.bmi)),
vitalSignValue: formatValueToTwoDp(
healthResult?.holisticHealth?.bmi),
vectorUrl: 'assets/images/svg/bmi.svg',
),
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "IBI",
// condition: RangeConditionWithTitle.fromJson(vital['HR']!),
// vitalSignValue:
// formatValueToTwoDp(healthResult?.vitalSigns.ibi)),
// if (_vitalSign?.hrvRmssd != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "HRV RMSSD",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.hrvRmssd)),
// if (_vitalSign?.temperature != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Temperature",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.vitalSigns.temperature)),
// if (_vitalSign?.bloodPressureSystolic != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Blood Pressure Systolic",
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.vitalSigns.bloodPressureSystolic)),
// if (_vitalSign?.bloodPressureDiastolic != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Blood Pressure Diastolic",
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.vitalSigns.bloodPressureDiastolic)),
// if (_holisticAnalysis != null)
// Container(
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
// child: const Text(
// "Holistic Analysis",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// if (_holisticAnalysis != null &&
// _holisticAnalysis?.absi != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "ABSI",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.holisticHealth?.absi)),
// if (_holisticAnalysis != null &&
// _holisticAnalysis?.cardiacWorkload != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Cardiac Workload",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.holisticHealth?.cardiacWorkload)),
// if (_holisticAnalysis != null &&
// _holisticAnalysis?.pulseRespiratoryQuotient != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Pulse Respiratory Quotient",
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.holisticHealth?.pulseRespiratoryQuotient)),
// if (_holisticAnalysis != null &&
// _holisticAnalysis?.waistToHeightRatio != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Waist to Height Ratio",
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.holisticHealth?.waistToHeightRatio)),
// if (_cardiovascularRisks != null)
// Container(
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
// child: const Text(
// "Cardiovascular Risks",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: TranslationBase.of(context).cvd,
// condition: RangeConditionWithTitle.fromJson(vital['cvd']!, formatValueToTwoDp(healthResult
// ?.risks?.cardiovascularRisks?.generalRisk)),
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.risks?.cardiovascularRisks?.generalRisk),
// vectorUrl: 'assets/images/svg/heartrate.svg',),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Congestive Heart Failure",
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.risks
// ?.cardiovascularRisks
// ?.congestiveHeartFailure)),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Coronary Heart Disease",
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.risks
// ?.cardiovascularRisks
// ?.coronaryHeartDisease)),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Intermittent Claudication",
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.risks
// ?.cardiovascularRisks
// ?.intermittentClaudication)),
// if (_cardiovascularRisks != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Stroke",
// vitalSignValue: formatValueToTwoDp(healthResult
// ?.risks?.cardiovascularRisks?.stroke)),
// if (_covidRisk != null)
// Container(
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
// child: const Text(
// "Covid Risks",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// if (_covidRisk != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Risk",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.risks?.covidRisk?.covidRisk)),
// if (_scanParameters != null)
// Container(
// margin: const EdgeInsets.fromLTRB(0, 25, 0, 10),
// child: const Text(
// "Scan Parameters",
// style: TextStyle(
// fontSize: 15,
// color: Colors.amber,
// fontWeight: FontWeight.bold,
// ),
// ),
// ),
// if (_scanParameters != null)
// VitalSignWidget(
// textColor: textColor,
// vitalSignName: "Signal Quality",
// vitalSignValue: formatValueToTwoDp(
// healthResult?.scanParameters?.signalQuality)),
]),
),
],
),
),
);
}
String formatValueToTwoDp(double? value) {
return (value != null) ? value.toStringAsFixed(2) : "";
}
}

@ -1,14 +1,38 @@
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:vital_sign_camera/vital_sign_camera.dart';
// import 'package:wakelock/wakelock.dart';
import '../uitl/translations_delegate_base.dart';
import 'components/bounding_box_widget.dart';
import 'components/error.dart';
import 'components/scan_condition_checklist.dart';
import 'components/scan_status.dart';
import 'components/start_button.dart';
import 'components/back_button.dart';
import 'components/button.dart';
import 'result_screen.dart';
final UserInfo userInfo = UserInfo(
age: 30,
gender: Gender.male,
weight: 75, // kg, Optional
height: 164, // cm, Optional
waistCircumference: 83, // cm Optional
userId: 'dbd13e86-47f4-4a43-85f6-cf62fa750117');
final VitalSignCameraConfig config = VitalSignCameraConfig(
apiKey: 'nIsZO45woSXSfIxsL1t79MWeIpsnGQr6B941MSF2',
serverId: ServerId.awsEnterpriseProd);
class VitalSigns extends StatefulWidget {
const VitalSigns({super.key});
@override
State<VitalSigns> createState() => _VitalSignState();
State<VitalSigns> createState() => _VitalSignsState();
}
class _VitalSignState extends State<VitalSigns> {
class _VitalSignsState extends State<VitalSigns> with RouteAware {
late final VitalSignCameraController _vitalSignCameraController;
late Future<CameraDevice?> cameraDevice;
@ -16,10 +40,9 @@ class _VitalSignState extends State<VitalSigns> {
void initState() {
super.initState();
cameraDevice = getFrontCamera();
// Wakelock.enable(); // keep the screen awake
}
double? _heartRate;
Future<CameraDevice?> getFrontCamera() async {
if (CameraPermissionStatus.authorized != await requestCameraPermission()) {
return null;
@ -27,44 +50,262 @@ class _VitalSignState extends State<VitalSigns> {
return queryCameraDevice(CameraPosition.front);
}
bool startedScanning =
false; // set true when start button is pressed, set false when health result is tapped or error occurs
bool isAllConditionsMet =
false; // check for the 6 scan conditions before enabling the start button
ScanConditions? _conditions;
GetHealthStage? _scanningStage;
double? _remainingTime;
Health? _healthResult;
NormalizedFaceBox? _normalizedFaceBox;
VideoFrameInfo? _videoFrameInfo;
dynamic _error;
int? _errorCode;
bool isCameraActive = true;
bool _showedHealthResult = false;
@override
void didChangeDependencies() {
super.didChangeDependencies();
// routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
// routeObserver.unsubscribe(this);
super.dispose();
}
@override
void didPushNext() {
setState(() {
isCameraActive = false;
});
}
@override
void didPopNext() {
setState(() {
isCameraActive = true;
startedScanning = false;
_healthResult = null;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(children: [
VitalSignCamera(
onCreated: _onVitalSignCameraCreated,
isActive: true,
userInfo: UserInfo(
age: 30, gender: Gender.male, userId: '__YOUR_USER_ID__'),
config: VitalSignCameraConfig(apiKey: '__YOUR_API_KEY__'),
device: cameraDevice,
onVideoFrameProcessed: _onVideoFrameProcessed),
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
final deviceSize = MediaQuery.of(context).size;
return AppScaffold(
isShowAppBar: true,
appBarTitle: TranslationBase.of(context).scanning,
showNewAppBar: true,
showNewAppBarTitle: true,
overrideUserLogin: true,
backgroundColor: Color(0xffF8F8F8),
body: Column(
children: [
if (_conditions != null)
ScanConditionChecklist(
deviceSize: deviceSize, conditions: _conditions!),
Expanded(
child: Stack(
children: [
ElevatedButton(
VitalSignCamera(
onCreated: _onVitalSignCameraCreated,
isActive: isCameraActive,
userInfo: userInfo,
config: config,
device: cameraDevice,
onVideoFrameProcessed: _onVideoFrameProcessed),
Positioned.fill(
child: CustomPaint(
painter: OvalOverlayPainter(),
),
),
if (_scanningStage !=
GetHealthStage
.idle) // show remaining time count down during scan
ScanStatus(
stage: _scanningStage, remainingTime: _remainingTime),
if (_scanningStage == GetHealthStage.idle &&
isCameraActive) // show start button only when it is not scanning
StartButton(
onPressed: () {
setState(() {
_vitalSignCameraController.startScanning();
startedScanning = true;
_healthResult = null;
_showedHealthResult = false;
});
},
child: const Text('start')),
Text('Heart rate: $_heartRate'),
disabled: !isAllConditionsMet,
),
],
),
),
]),
],
),
);
// return Scaffold(
// body: Stack(
// children: [
// VitalSignCamera(
// onCreated: _onVitalSignCameraCreated,
// isActive: isCameraActive,
// userInfo: userInfo,
// config: config,
// device: cameraDevice,
// onVideoFrameProcessed: _onVideoFrameProcessed),
// // A back button to navigate back to previous screen
// if (_scanningStage == GetHealthStage.idle && !startedScanning)
// BackHomeButton(
// onPressed: () {
// setState(() {
// isCameraActive = false;
// });
// Navigator.pop(context);
// },
// deviceSize: deviceSize),
// // A button to toggle isCameraActive
// if (_scanningStage == GetHealthStage.idle && !startedScanning)
// Button(
// onPressed: () {
// setState(() {
// isCameraActive = !isCameraActive;
// });
// },
// deviceSize: deviceSize,
// title: "Toggle isCameraActive",
// alignment: Alignment.topRight,
// margin: EdgeInsets.fromLTRB(
// 0, deviceSize.height * 0.05, deviceSize.width * 0.05, 0)),
// if (!isCameraActive)
// const Center(
// child: Text(
// "Camera is not active.",
// textAlign: TextAlign.center,
// ))
// else
// Stack(children: [
// if (_scanningStage == GetHealthStage.idle &&
// isCameraActive) // show start button only when it is not scanning
// StartButton(
// onPressed: () {
// setState(() {
// _vitalSignCameraController.startScanning();
// startedScanning = true;
// _healthResult = null;
// _showedHealthResult = false;
// });
// },
// disabled: !isAllConditionsMet,
// ),
// if (_conditions != null &&
// _scanningStage == GetHealthStage.idle &&
// !startedScanning) // show scan conditions checking only when it is not scanning or showing health result
// ScanConditionChecklist(
// deviceSize: deviceSize, conditions: _conditions!),
// if (_scanningStage !=
// GetHealthStage
// .idle) // show remaining time count down during scan
// ScanStatus(
// stage: _scanningStage, remainingTime: _remainingTime),
// if (!startedScanning ||
// _healthResult ==
// null) // show bounding box before and during scan, but not when health result is shown
// BoundingBoxWidget(
// deviceSize: deviceSize,
// facebox: _normalizedFaceBox,
// videoFrameInfo: _videoFrameInfo),
// if (_error != null) Error(error: _error, errorCode: _errorCode),
// ])
// ],
// ),
// );
}
void _onVideoFrameProcessed(VideoFrameProcessedEvent event) {
// setState(() {
// _heartRate = event.healthResult?.health?.vitalSigns.heartRate;
// });
if (!_showedHealthResult &&
_healthResult == null &&
event.healthResult?.health != null) {
_showedHealthResult = true;
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ResultScreen(
healthResult: _healthResult,
),
),
);
}
setState(() {
_conditions = event.scanConditions;
isAllConditionsMet = checkIfAllScanConditionsMet();
_scanningStage = event.healthResult?.stage;
_remainingTime = event.healthResult?.remainingTime;
_healthResult = event.healthResult?.health;
_normalizedFaceBox = event.faceBox;
_videoFrameInfo = event.videoFrameInfo;
_error = event.healthResult?.error;
_errorCode = event.healthResult?.errorCode;
if (_error != null) {
// when error occurs, reshow condition checklist & disabled start button
startedScanning = false;
isAllConditionsMet = false;
}
});
}
bool checkIfAllScanConditionsMet() {
if (_conditions?.centered == true &&
_conditions?.distance == true &&
_conditions?.frameRate == true &&
_conditions?.lighting == true &&
_conditions?.movement == true &&
_conditions?.serverReady == true) {
return true;
} else {
return false;
}
}
void _onVitalSignCameraCreated(VitalSignCameraController controller) {
_vitalSignCameraController = controller;
}
}
class OvalOverlayPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final Paint overlayPaint = Paint()
..color = Colors.white.withOpacity(0.7)
..style = PaintingStyle.fill;
canvas.drawRect(
Rect.fromLTWH(0, 0, size.width, size.height),
overlayPaint,
);
final Rect ovalRect = Rect.fromCenter(
center: Offset(size.width / 2, size.height / 2),
width: size.width * 0.9,
height: size.height * 0.7,
);
final Path ovalPath = Path()..addOval(ovalRect);
canvas.clipPath(ovalPath, doAntiAlias: true);
canvas.drawRect(
Rect.fromLTWH(0, 0, size.width, size.height),
Paint()..blendMode = BlendMode.clear,
);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}

@ -83,6 +83,7 @@ class AppScaffold extends StatefulWidget {
final int? currentTab;
final bool isShowPharmacyAppbar;
final Widget? customAppBar;
final bool overrideUserLogin;
AppScaffold setOnAppBarCartClick(VoidCallback onClick) {
_onCartClick = onClick;
@ -130,7 +131,8 @@ class AppScaffold extends StatefulWidget {
this.backButtonTab,
this.changeCurrentTab,
this.currentTab,
this.isShowPharmacyAppbar = false});
this.isShowPharmacyAppbar = false,
this.overrideUserLogin= false});
@override
_AppScaffoldState createState() => _AppScaffoldState();
@ -216,7 +218,7 @@ class _AppScaffoldState extends State<AppScaffold> {
AppGlobal.context = context;
PharmacyPagesViewModel pagesViewModel = Provider.of(context);
bool isUserNotLogin = (!Provider.of<ProjectViewModel>(context, listen: false).isLogin && widget.isShowDecPage);
bool isUserNotLogin = (widget.overrideUserLogin)?false:(!Provider.of<ProjectViewModel>(context, listen: false).isLogin && widget.isShowDecPage);
return Scaffold(
backgroundColor: widget.backgroundColor ?? CustomColors.appBackgroudGrey2Color,

@ -0,0 +1 @@
TODO: Add your license here.

@ -0,0 +1,4 @@
include: package:flutter_lints/flutter.yaml
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

@ -1,89 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

@ -0,0 +1 @@
rootProject.name = 'vital_sign_camera'

@ -0,0 +1,23 @@
package ai.panoptic.vital_sign_camera
import android.content.Context
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.lifecycle.Lifecycle
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.StandardMessageCodec
import io.flutter.plugin.platform.PlatformView
import io.flutter.plugin.platform.PlatformViewFactory
class VitalSignCameraFactory(private val messenger: BinaryMessenger, private val lifecycle: Lifecycle) :
PlatformViewFactory(StandardMessageCodec.INSTANCE) {
val TAG = "VitalSignCameraFactory"
@RequiresApi(Build.VERSION_CODES.O)
override fun create(context: Context, id: Int, o: Any?): PlatformView {
val props = o as Map<String, Any>
return FlutterVitalSignCamera(context, messenger, id, props, lifecycle)
}
}

@ -0,0 +1,38 @@
.idea/
.vagrant/
.sconsign.dblite
.svn/
.DS_Store
*.swp
profile
DerivedData/
build/
GeneratedPluginRegistrant.h
GeneratedPluginRegistrant.m
.generated/
*.pbxuser
*.mode1v3
*.mode2v3
*.perspectivev3
!default.pbxuser
!default.mode1v3
!default.mode2v3
!default.perspectivev3
xcuserdata
*.moved-aside
*.pyc
*sync/
Icon?
.tags*
/Flutter/Generated.xcconfig
/Flutter/ephemeral/
/Flutter/flutter_export_environment.sh

@ -0,0 +1,289 @@
//
// FlutterVitalSignCamera.swift
// vital_sign_camera
//
// Created by Eddie Lau on 24/1/2023.
//
import Foundation
import Flutter
import UIKit
import PromiseKit
import VitalSignEngineCore
class FlutterVitalSignCamera: NSObject, FlutterPlatformView {
private var camera: VitalSignCamera
private var methodChannel: FlutterMethodChannel
private var eventSink: FlutterEventSink?
func view() -> UIView {
return camera
}
init(
frame: CGRect,
viewIdentifier viewId: Int64,
arguments args: Any?,
binaryMessenger messenger: FlutterBinaryMessenger
) {
methodChannel = FlutterMethodChannel(name: "ai.panoptic/channel/flutter_vital_sign_camera_\(viewId)", binaryMessenger: messenger)
camera = VitalSignCamera(frame: frame)
super.init()
camera.faceDetector = MLKitFaceDetector()
camera.configure(args: args, onVideoFrameProcessed: onVideoFrameProcessed)
methodChannel.setMethodCallHandler(onMethodCall)
let channel = FlutterEventChannel(name: "ai.panoptic/channel/flutter_vital_sign_camera_processed_frame_event_\(viewId)", binaryMessenger: messenger)
channel.setStreamHandler(self)
}
func onMethodCall(call: FlutterMethodCall, result: @escaping FlutterResult) {
switch(call.method){
case "startScanning":
NSLog("FlutterVitalSignCamera: startScanning")
camera.startScanning().done {
result(nil)
}.catch { error in
result(FlutterError(code: "\(error.code)", message: error.message, details: nil))
}
case "stopScanning":
NSLog("FlutterVitalSignCamera: stopScanning")
camera.stopScanning().done {
result(nil)
}.catch { error in
result(FlutterError(code: "\(error.code)", message: error.message, details: nil))
}
case "configure":
NSLog("FlutterVitalSignCamera: configure \(call.arguments ?? "nil")")
camera.configure(args: call.arguments, onVideoFrameProcessed: onVideoFrameProcessed)
default:
result(FlutterMethodNotImplemented)
}
}
func onVideoFrameProcessed(result: ProcessResult) {
let flutterMap = result.dictionary.flutterMap
guard let eventSink = eventSink else {
return
}
eventSink(flutterMap)
}
}
extension FlutterVitalSignCamera: FlutterStreamHandler {
func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
eventSink = events
return nil
}
func onCancel(withArguments arguments: Any?) -> FlutterError? {
eventSink = nil
return nil
}
}
extension VitalSignCamera {
func configure(args:Any?, onVideoFrameProcessed:@escaping (ProcessResult)->Void) {
if let args = args as? [String:Any] {
configure(dict: args, onVideoFrameProcessed: onVideoFrameProcessed)
} else {
NSLog("Error: Invalid props: \(args ?? "nil")")
}
}
func configure(dict:Dictionary<String,Any>, onVideoFrameProcessed:@escaping (ProcessResult)->Void) {
var device:CameraDevice?
if let id = dict["id"] as? String {
device = VitalSignCamera.availableCameraDevices().first { $0.id == id }
}
var isActive = false
if let isActiveNumber = dict["isActive"] as? NSNumber {
isActive = isActiveNumber.boolValue
}
guard let userInfoDict = dict["userInfo"] as? Dictionary<String,Any>,
let userInfo = UserInfo(flutterMap: userInfoDict) else {
NSLog("Error: Invalid userInfo: \(dict["userInfo"] ?? "nil")")
return
}
guard let configDict = dict["config"] as? NSDictionary,
let config = VitalSignEngineConfig(flutterMap: configDict) else {
NSLog("Error: Invalid config: \(dict["config"] ?? "nil")")
return
}
let previewLayerGravity:PreviewLayerGravity = {
if let previewLayerGravityNum = dict["previewLayerGravity"] as? NSNumber,
let previewLayerGravity = PreviewLayerGravity(number: previewLayerGravityNum) {
return previewLayerGravity
}
return PreviewLayerGravity.resizeAspectFill
}()
configure { camera in
camera.device = device
camera.isActive = isActive
camera.userInfo = userInfo
camera.config = config
camera.previewLayerGravity = previewLayerGravity
camera.onVideoFrameProcessed = onVideoFrameProcessed
}
}
}
extension UserInfo {
init?(flutterMap:Dictionary<String,Any>) {
guard let genderObj = flutterMap["gender"] as? NSNumber else {
NSLog("Error: Invalid gender: \(flutterMap["gender"] ?? "nil")")
return nil
}
guard let gender = Gender(rawValue: genderObj.intValue) else {
NSLog("Error: Invalid gender: \(flutterMap["gender"] ?? "nil")")
return nil
}
guard let ageObj = flutterMap["age"] as? NSNumber else {
NSLog("Error: Invalid age: \(flutterMap["age"] ?? "nil")")
return nil
}
let age = ageObj.doubleValue
guard let userIdObj = flutterMap["userId"] as? NSString else {
NSLog("Error: Invalid userId: \(flutterMap["userId"] ?? "nil")")
return nil
}
self.init(
gender: gender,
age: age,
weight: (flutterMap["weight"] as? NSNumber)?.doubleValue,
height: (flutterMap["height"] as? NSNumber)?.doubleValue,
smoking: (flutterMap["smoker"] as? NSNumber)?.boolValue,
hypertension: Hypertension(hasHypertension: (flutterMap["hypertension"] as? NSNumber)?.boolValue),
bpMedication: (flutterMap["bpMedication"] as? NSNumber)?.boolValue,
diabetic: Diabetic(hasDiabetic: (flutterMap["diabetic"] as? NSNumber)?.boolValue),
waistCircumference: (flutterMap["waistCircumference"] as? NSNumber)?.doubleValue,
appUserId: flutterMap["appUserId"] as? String,
userId: userIdObj as String
)
}
}
extension Diabetic {
init?(hasDiabetic:Bool?) {
guard let hasDiabetic = hasDiabetic else {
return nil
}
if (hasDiabetic) {
self = .type1
} else {
self = .no
}
}
}
extension Hypertension {
init?(hasHypertension:Bool?) {
guard let hasHypertension = hasHypertension else {
return nil
}
if (hasHypertension) {
self = .stage1
} else {
self = .no
}
}
}
extension VitalSignEngineConfig {
init?(flutterMap: NSDictionary) {
/*
public var errorExpirationTime: TimeInterval?
*/
guard let map = flutterMap as? [String:Any] else {
NSLog("Error: Invalid config: \(flutterMap)")
return nil
}
let serverIdObj = map["serverId"] as? NSNumber
let serverId = serverIdObj != nil ? ServerId(rawValue: serverIdObj!.intValue) : nil
let dataCollectionDuration = map["dataCollectionDuration"] as? NSNumber
let dataSendingDuration = map["dataSendingDuration"] as? NSNumber
let dataSendingRate = map["dataSendingRate"] as? NSNumber
let dataWindowDuration = map["dataWindowDuration"] as? NSNumber
let apiKey = map["apiKey"] as? NSString
let faceLostTimeout = map["faceLostTimeout"] as? NSNumber
let errorExpirationTime = map["errorExpirationTime"] as? NSNumber
self.init(
serverId: serverId,
dataCollectionDuration: dataCollectionDuration?.doubleValue,
dataSendingDuration: dataSendingDuration?.doubleValue,
dataSendingRate: dataSendingRate?.doubleValue,
dataWindowDuration: dataWindowDuration?.doubleValue,
apiKey: apiKey as String?,
faceLostTimeout: faceLostTimeout?.doubleValue,
errorExpirationTime: errorExpirationTime?.doubleValue
)
}
}
extension PreviewLayerGravity {
init?(number: NSNumber) {
if (number.intValue == 0) {
self = .resizeAspectFill
} else if (number.intValue == 1) {
self = .resizeAspect
} else {
return nil
}
}
}
func toFlutterValue(value:Any) -> Any {
if let boolValue = value as? Bool {
return NSNumber(value: boolValue)
} else if let doubleValue = value as? Double {
return NSNumber(value: doubleValue)
} else if let intValue = value as? Int {
return NSNumber(value: intValue)
} else if let int32Value = value as? Int32 {
return NSNumber(value: int32Value)
} else if let stringValue = value as? String {
return stringValue
} else if let map = value as? [String:Any] {
return map.flutterMap
} else if let array = value as? [Any] {
return array.map { toFlutterValue(value: $0) }
} else {
return value
}
}
extension Dictionary<String,Any> {
var flutterMap:[String:Any] {
var map = [String:Any]()
keys.forEach { key in
map[key] = toFlutterValue(value: self[key]!)
}
return map
}
}

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>VitalSignEngineCore.framework/VitalSignEngineCore</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>ios-arm64</string>
<key>LibraryPath</key>
<string>VitalSignEngineCore.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>VitalSignEngineCore.framework/VitalSignEngineCore</string>
<key>DebugSymbolsPath</key>
<string>dSYMs</string>
<key>LibraryIdentifier</key>
<string>ios-x86_64-simulator</string>
<key>LibraryPath</key>
<string>VitalSignEngineCore.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

@ -0,0 +1,521 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Base.lproj/Settings.storyboardc/2rd-HR-hIS-view-RZ6-1m-lpj.nib</key>
<data>
DlX1ov7q5g11ecY5Aps+/droo8M=
</data>
<key>Base.lproj/Settings.storyboardc/33y-Fu-8eO-view-QTb-QW-4kt.nib</key>
<data>
MQc4ycI9hcuSqtrFyBDkFp9SbdQ=
</data>
<key>Base.lproj/Settings.storyboardc/5qf-l9-Bpt-view-lhE-xR-CfP.nib</key>
<data>
8UOg8TxqBGqy9eTwPLDRx+n5ROk=
</data>
<key>Base.lproj/Settings.storyboardc/AVI-Sr-bRj-view-fsz-RU-5qo.nib</key>
<data>
8L7XYRvTiiuCNRy9uCevQiK+c8g=
</data>
<key>Base.lproj/Settings.storyboardc/Info.plist</key>
<data>
o+0ubj7CZACC4YUDlutmD/FOssc=
</data>
<key>Base.lproj/Settings.storyboardc/UINavigationController-siC-xZ-ohv.nib</key>
<data>
HbItXk+fdFNmjnnjvSNER2qNalA=
</data>
<key>Base.lproj/Settings.storyboardc/UITableViewController-2rd-HR-hIS.nib</key>
<data>
cH78RC3lRwc9lqvY6NO6dh+LDuI=
</data>
<key>Base.lproj/Settings.storyboardc/UITableViewController-33y-Fu-8eO.nib</key>
<data>
Wv0FmElDgVwxyHfQg0dVh5gOZz4=
</data>
<key>Base.lproj/Settings.storyboardc/UITableViewController-5qf-l9-Bpt.nib</key>
<data>
05hXWFPNBMFvKa/QGHHX7jeZk1k=
</data>
<key>Base.lproj/Settings.storyboardc/UITableViewController-AVI-Sr-bRj.nib</key>
<data>
IQ6Q3fPzcXh4Ac7Vh4y+m3QDdaM=
</data>
<key>Base.lproj/Settings.storyboardc/UITableViewController-X40-UA-27w.nib</key>
<data>
KFMokAoeV647g58ePqRaYhWv60k=
</data>
<key>Base.lproj/Settings.storyboardc/UITableViewController-lvC-jH-Oee.nib</key>
<data>
926RX3dTGWx7FV7VBfKdGbgntUo=
</data>
<key>Base.lproj/Settings.storyboardc/UITableViewController-rrE-mW-kkd.nib</key>
<data>
4fXkddGY7hX2bm9jUdLPg++CW08=
</data>
<key>Base.lproj/Settings.storyboardc/X40-UA-27w-view-dHV-IZ-101.nib</key>
<data>
xd6IKfbmTjrgUvv8kp3L5qnralc=
</data>
<key>Base.lproj/Settings.storyboardc/lvC-jH-Oee-view-hFr-Eu-EPX.nib</key>
<data>
HIJ/PFe3xcSy3UuJJ7nNI3JEUxk=
</data>
<key>Base.lproj/Settings.storyboardc/rrE-mW-kkd-view-jSQ-O0-3rP.nib</key>
<data>
IWe3izwkk2psNBBJ2sowS1eXTC8=
</data>
<key>Base.lproj/Settings.storyboardc/vU1-Um-10o-view-kVG-Zg-msn.nib</key>
<data>
XNHpbWcnqGvpxMnbT7KRhBn/5P0=
</data>
<key>Headers/VitalSignEngineCore-Swift.h</key>
<data>
Cgeyaqzpktx52m7dkRc2BOpHj+M=
</data>
<key>Info.plist</key>
<data>
Wehu7kSuoAeDcfbNuPsXlFJHyKk=
</data>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.abi.json</key>
<data>
EOEHbSNtPKXpxewOjRgS5UAeO/c=
</data>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface</key>
<data>
7tbL4/vTEf4dq/odGgDY7QuhO7o=
</data>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftdoc</key>
<data>
1YeE1UoLmWikKYm7aJTfKyuOPss=
</data>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftinterface</key>
<data>
7tbL4/vTEf4dq/odGgDY7QuhO7o=
</data>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftmodule</key>
<data>
Hyxie32rmUNCm6rfCxmPAtzrWS4=
</data>
<key>Modules/module.modulemap</key>
<data>
H4W7X/Ori5z0/DLyBmRIHfsqoW0=
</data>
<key>en.lproj/Localizable.strings</key>
<dict>
<key>hash</key>
<data>
JjW5goFEk4rLGwgbsFdIb77963c=
</data>
<key>optional</key>
<true/>
</dict>
<key>en.lproj/Settings.strings</key>
<dict>
<key>hash</key>
<data>
ghu5nCE2WhVAqtKLmh6ZSNXGUNs=
</data>
<key>optional</key>
<true/>
</dict>
<key>video_for_simulator.mov</key>
<data>
xGCn3pZccdHuxEpMT9Ty6IpQswY=
</data>
<key>zh-HK.lproj/Localizable.strings</key>
<dict>
<key>hash</key>
<data>
vbGclobSSiQAaj11PDC+uOY/uhc=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-HK.lproj/Settings.strings</key>
<dict>
<key>hash</key>
<data>
/nrp+p8TQubWuI19v2cfbXG3bTQ=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hans.lproj/Localizable.strings</key>
<dict>
<key>hash</key>
<data>
pa8dPk7vY6e0ezzEr4Km2znkYXo=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hans.lproj/Settings.strings</key>
<dict>
<key>hash</key>
<data>
r18wFxW+CzxwkANdgWZz/Wrsn2w=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hant.lproj/Localizable.strings</key>
<dict>
<key>hash</key>
<data>
vbGclobSSiQAaj11PDC+uOY/uhc=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hant.lproj/Settings.strings</key>
<dict>
<key>hash</key>
<data>
/nrp+p8TQubWuI19v2cfbXG3bTQ=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>files2</key>
<dict>
<key>Base.lproj/Settings.storyboardc/2rd-HR-hIS-view-RZ6-1m-lpj.nib</key>
<dict>
<key>hash2</key>
<data>
6UqeKX29VyBukl1h73a2B5lqSMXM7SLm27q9Epqfl0o=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/33y-Fu-8eO-view-QTb-QW-4kt.nib</key>
<dict>
<key>hash2</key>
<data>
4WUQzfqysn2notPjP+iMtC1kGv5i1TlZxDDjMw762sc=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/5qf-l9-Bpt-view-lhE-xR-CfP.nib</key>
<dict>
<key>hash2</key>
<data>
3tsNb1TynPV4jP8eLNY7oYUXQ8XufStmGoClUxeut+k=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/AVI-Sr-bRj-view-fsz-RU-5qo.nib</key>
<dict>
<key>hash2</key>
<data>
rKgWJy6gY5JR2wqvGEW97XuWhWpdY18oUYtY26YnDAM=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/Info.plist</key>
<dict>
<key>hash2</key>
<data>
Lfs3i8pilnv7p97l6teqeiPulahMyvKir++zGdfNFi8=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/UINavigationController-siC-xZ-ohv.nib</key>
<dict>
<key>hash2</key>
<data>
AeXV1+FMVpr7sjaaPIa85qZRjiLnFcu2OapvfkSbmFQ=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/UITableViewController-2rd-HR-hIS.nib</key>
<dict>
<key>hash2</key>
<data>
BmbkkpoOPGavqEaX2s8IRznQuJG3ZRrpToUjkf2OW2g=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/UITableViewController-33y-Fu-8eO.nib</key>
<dict>
<key>hash2</key>
<data>
r2L54zbeqH31x5rt/9Og/Gxrh/v5I0EQIzzgs8F5XvM=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/UITableViewController-5qf-l9-Bpt.nib</key>
<dict>
<key>hash2</key>
<data>
0SDimIQWuI3TVkE5SZzdcvlrWwCku/b1IyI98vZSI6I=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/UITableViewController-AVI-Sr-bRj.nib</key>
<dict>
<key>hash2</key>
<data>
DgMA3jMJ7qfESjpw1zSsIB/xWgn1XiBe/INXFT1IFis=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/UITableViewController-X40-UA-27w.nib</key>
<dict>
<key>hash2</key>
<data>
XWf9vby9yh//gBzBJxbNWPzBlxzW09djTCRmLwJdSek=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/UITableViewController-lvC-jH-Oee.nib</key>
<dict>
<key>hash2</key>
<data>
iWiODb3GEr4QVCx7KGeP0W4pg874oyE/BA2BeLovNAc=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/UITableViewController-rrE-mW-kkd.nib</key>
<dict>
<key>hash2</key>
<data>
4EEDOg2plUzrQgohBWf0L9xYpKgiv6KN69VmPWnFKmQ=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/X40-UA-27w-view-dHV-IZ-101.nib</key>
<dict>
<key>hash2</key>
<data>
ylq1U3Tmk9jt5epbca2+mjKmPhVroBEYoSVbrY0Eivo=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/lvC-jH-Oee-view-hFr-Eu-EPX.nib</key>
<dict>
<key>hash2</key>
<data>
ZX8HTCH1jPmC0/XnzN2JgeJIt1KFIrBQZ0+nTG98d9Q=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/rrE-mW-kkd-view-jSQ-O0-3rP.nib</key>
<dict>
<key>hash2</key>
<data>
lWMbq05IoCg8jRapjGtpO8sVO4KK7lP+ZoZ4F5zLGdA=
</data>
</dict>
<key>Base.lproj/Settings.storyboardc/vU1-Um-10o-view-kVG-Zg-msn.nib</key>
<dict>
<key>hash2</key>
<data>
D7MDZLZ3dgPYif/8jzhw/0X8xxK0zQi5BTPEcvsLbB8=
</data>
</dict>
<key>Headers/VitalSignEngineCore-Swift.h</key>
<dict>
<key>hash2</key>
<data>
D/Qqm2iuCa8pyzYDySM8sXDTEci5eFMqmAjll+u8JKk=
</data>
</dict>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.abi.json</key>
<dict>
<key>hash2</key>
<data>
mNR8nzjlC5AOrKrIADM7eVAyIciXEDWgeLkIeAgXhRw=
</data>
</dict>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface</key>
<dict>
<key>hash2</key>
<data>
MvRvSG8uFeTMX7EMytrfYIsjE3Uq/ItOK4PKwV9zhOI=
</data>
</dict>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftdoc</key>
<dict>
<key>hash2</key>
<data>
X2642qYx/sxLipHl7q9eUkTcz0ffENvmLZYHfyfY2Do=
</data>
</dict>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftinterface</key>
<dict>
<key>hash2</key>
<data>
MvRvSG8uFeTMX7EMytrfYIsjE3Uq/ItOK4PKwV9zhOI=
</data>
</dict>
<key>Modules/VitalSignEngineCore.swiftmodule/x86_64-apple-ios-simulator.swiftmodule</key>
<dict>
<key>hash2</key>
<data>
JkRKqR9nqkfWCsoIpQU/cSSs0o1jo9ZpJQSzejaYOKE=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash2</key>
<data>
nMoAubewPDJNJjqZL6PZBElC7M8p3Tk0uDkB8+Slh8Y=
</data>
</dict>
<key>en.lproj/Localizable.strings</key>
<dict>
<key>hash2</key>
<data>
QrXMgghjBTXRSvFMUnrNKKviu2bVwCvCIw6x/0NxJ+4=
</data>
<key>optional</key>
<true/>
</dict>
<key>en.lproj/Settings.strings</key>
<dict>
<key>hash2</key>
<data>
kf4wZrE3eIFcKMHGteXjvdaAjVq66HQb3TOI/5X4fuc=
</data>
<key>optional</key>
<true/>
</dict>
<key>video_for_simulator.mov</key>
<dict>
<key>hash2</key>
<data>
TutAEU/GGl/BP67ffkZKsoWD1iC/xCkbElVgv+BGyZU=
</data>
</dict>
<key>zh-HK.lproj/Localizable.strings</key>
<dict>
<key>hash2</key>
<data>
DcL8ikA0bN+9lI7/salx04eGeosijL5biwSBVr+8H78=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-HK.lproj/Settings.strings</key>
<dict>
<key>hash2</key>
<data>
56y8muLdb8wQl7DMNwERIWBwLRpsbWoC1xgk3NPufEo=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hans.lproj/Localizable.strings</key>
<dict>
<key>hash2</key>
<data>
TKPfabZnaOrV3VA1XqjR6SqsWZvTcMUyUzZBQ6goBb8=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hans.lproj/Settings.strings</key>
<dict>
<key>hash2</key>
<data>
0A5Y7ZjUhASI3ZW0gLqoZNubDsKQNcbexBJcHOsC/FQ=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hant.lproj/Localizable.strings</key>
<dict>
<key>hash2</key>
<data>
DcL8ikA0bN+9lI7/salx04eGeosijL5biwSBVr+8H78=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hant.lproj/Settings.strings</key>
<dict>
<key>hash2</key>
<data>
56y8muLdb8wQl7DMNwERIWBwLRpsbWoC1xgk3NPufEo=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

@ -0,0 +1,183 @@
/* Class = "UILabel"; text = "Continuously monitors exposure levels and automatically adjusts exposure when necessary."; ObjectID = "2ad-p5-WH5"; */
"2ad-p5-WH5.text" = "持續監測曝光水平並在必要時自動調整曝光。";
/* Class = "UILabel"; text = "White Balance"; ObjectID = "4ie-UM-xw1"; */
"4ie-UM-xw1.text" = "白平衡";
/* Class = "UILabel"; text = "Front"; ObjectID = "55X-XR-Xoe"; */
"55X-XR-Xoe.text" = "前置";
/* Class = "UITableViewController"; text = "Preview Layer Gravity"; ObjectID = "5qf-l9-Bpt"; */
"5qf-l9-Bpt.title" = "相機預覽展示形式";
/* Class = "UILabel"; text = "Show the camera preview by preserving its aspect ratio and fits it within the layer's bounds."; ObjectID = "6I3-ak-vEx"; */
"6I3-ak-vEx.text" = "按比例顯示相機預覽,並使其限制在圖層的範圍內。";
/* Class = "UILabel"; text = "Continuous Auto"; ObjectID = "6yD-61-CEf"; */
"6yD-61-CEf.text" = "連續自動";
/* Class = "UILabel"; text = "White Balance"; ObjectID = "77e-kN-xI5"; */
"77e-kN-xI5.text" = "白平衡";
/* Class = "UILabel"; text = "Preview Gravity"; ObjectID = "7AW-UQ-WfA"; */
"7AW-UQ-WfA.text" = "相機預覽展示形式";
/* Class = "UILabel"; text = "Lens Aperture"; ObjectID = "7ZB-LO-AYF"; */
"7ZB-LO-AYF.text" = "鏡頭光圈";
/* Class = "UINavigationItem"; text = "Preview Gravity"; ObjectID = "7aV-Vw-b2w"; */
"7aV-Vw-b2w.title" = "相機預覽展示形式";
/* Class = "UINavigationItem"; text = "Camera"; ObjectID = "8D6-fu-CJu"; */
"8D6-fu-CJu.title" = "相機";
/* Class = "UILabel"; text = "Medium"; ObjectID = "9xa-bl-6eJ"; */
"9xa-bl-6eJ.text" = "中等品質";
/* Class = "UITableViewSection"; text = "Camera"; ObjectID = "AKs-Pq-lcR"; */
"AKs-Pq-lcR.headerTitle" = "相機";
/* Class = "UILabel"; text = "640x480"; ObjectID = "B6a-KT-T4m"; */
"B6a-KT-T4m.text" = "640x480";
/* Class = "UILabel"; text = "Face Detector"; ObjectID = "Byq-a3-CTH"; */
"Byq-a3-CTH.text" = "人臉辨識";
/* Class = "UILabel"; text = "1920x1080"; ObjectID = "Dp9-9b-EEt"; */
"Dp9-9b-EEt.text" = "1920x1080";
/* Class = "UILabel"; text = "A mode that locks the white balance state."; ObjectID = "FOH-2X-R88"; */
"FOH-2X-R88.text" = "一種鎖定白平衡狀態的模式。";
/* Class = "UILabel"; text = "Duration"; ObjectID = "FPh-cx-ffz"; */
"FPh-cx-ffz.text" = "持續時間";
/* Class = "UILabel"; text = "Exposure"; ObjectID = "Hmc-Mc-AME"; */
"Hmc-Mc-AME.text" = "曝光";
/* Class = "UILabel"; text = "Resolution"; ObjectID = "J12-De-6Ah"; */
"J12-De-6Ah.text" = "解析度";
/* Class = "UITextField"; text = "100"; ObjectID = "J2A-ot-v0j"; */
"J2A-ot-v0j.text" = "100";
/* Class = "UILabel"; text = "30 fps"; ObjectID = "J5t-dB-TfS"; */
"J5t-dB-TfS.text" = "30 fps";
/* Class = "UILabel"; text = "Frame Rate"; ObjectID = "JgS-aW-Prv"; */
"JgS-aW-Prv.text" = "幀率";
/* Class = "UILabel"; text = "Video Size"; ObjectID = "KJ4-Uw-4AI"; */
"KJ4-Uw-4AI.text" = "視頻尺寸";
/* Class = "UILabel"; text = "Locked"; ObjectID = "Nuf-3J-OLu"; */
"Nuf-3J-OLu.text" = "鎖定";
/* Class = "UILabel"; text = "Frame Rate"; ObjectID = "RKd-LF-IM5"; */
"RKd-LF-IM5.text" = "幀率";
/* Class = "UILabel"; text = "Resize Aspect"; ObjectID = "Rz5-6b-y0h"; */
"Rz5-6b-y0h.text" = "按比例調整";
/* Class = "UILabel"; text = "f1.0"; ObjectID = "SxX-36-5NN"; */
"SxX-36-5NN.text" = "f1.0";
/* Class = "UILabel"; text = "Exposure"; ObjectID = "Szo-Pj-jno"; */
"Szo-Pj-jno.text" = "曝光";
/* Class = "UILabel"; text = "ISO"; ObjectID = "TTb-bW-pMN"; */
"TTb-bW-pMN.text" = "ISO";
/* Class = "UILabel"; text = "Camera"; ObjectID = "WaU-wB-ecv"; */
"WaU-wB-ecv.text" = "相機";
/* Class = "UITableViewController"; text = "White Balance"; ObjectID = "X40-UA-27w"; */
"X40-UA-27w.title" = "白平衡";
/* Class = "UINavigationItem"; text = "Settings"; ObjectID = "Xje-kQ-L0P"; */
"Xje-kQ-L0P.title" = "設定";
/* Class = "UIBarButtonItem"; text = "Close"; ObjectID = "XvT-YW-xBL"; */
"XvT-YW-xBL.title" = "關閉";
/* Class = "UILabel"; text = "Locked"; ObjectID = "YGU-l8-ZMR"; */
"YGU-l8-ZMR.text" = "鎖定";
/* Class = "UILabel"; text = "Format"; ObjectID = "YPv-nc-7nK"; */
"YPv-nc-7nK.text" = "格式";
/* Class = "UILabel"; text = "Locked"; ObjectID = "YrA-Y0-l1z"; */
"YrA-Y0-l1z.text" = "鎖定";
/* Class = "UINavigationItem"; text = "Format"; ObjectID = "Z09-mH-385"; */
"Z09-mH-385.title" = "格式";
/* Class = "UILabel"; text = "Camera On/Off"; ObjectID = "ZiN-q3-8Cs"; */
"ZiN-q3-8Cs.text" = "相機 開/關";
/* Class = "UINavigationItem"; text = "White Balance"; ObjectID = "b1A-7E-zBH"; */
"b1A-7E-zBH.title" = "白平衡";
/* Class = "UILabel"; text = "100"; ObjectID = "b1L-VE-boz"; */
"b1L-VE-boz.text" = "100";
/* Class = "UINavigationItem"; text = "Exposure"; ObjectID = "bwF-Fn-XeY"; */
"bwF-Fn-XeY.title" = "曝光";
/* Class = "UIButton"; text = "Test"; ObjectID = "cC0-N9-hxt"; */
"cC0-N9-hxt.configuration.title" = "測試";
/* Class = "UIButton"; text = "Button"; ObjectID = "cC0-N9-hxt"; */
"cC0-N9-hxt.normalTitle" = "測試";
/* Class = "UISegmentedControl"; text = "sec"; ObjectID = "fSu-H9-Cz9"; */
"fSu-H9-Cz9.segmentTitles[0]" = "秒";
/* Class = "UISegmentedControl"; text = "ms"; ObjectID = "fSu-H9-Cz9"; */
"fSu-H9-Cz9.segmentTitles[1]" = "毫秒";
/* Class = "UISegmentedControl"; text = "μs"; ObjectID = "fSu-H9-Cz9"; */
"fSu-H9-Cz9.segmentTitles[2]" = "微秒";
/* Class = "UILabel"; text = "Locked"; ObjectID = "fty-cZ-huK"; */
"fty-cZ-huK.text" = "鎖定";
/* Class = "UILabel"; text = "Auto (10ms)"; ObjectID = "hVI-M7-yVe"; */
"hVI-M7-yVe.text" = "自動10毫秒";
/* Class = "UILabel"; text = "Camera Name"; ObjectID = "if3-5B-xPF"; */
"if3-5B-xPF.text" = "相機名稱";
/* Class = "UILabel"; text = "Unit"; ObjectID = "l6D-7r-DH5"; */
"l6D-7r-DH5.text" = "單位";
/* Class = "UINavigationItem"; text = "Camera Test"; ObjectID = "lZ7-W3-MRS"; */
"lZ7-W3-MRS.title" = "相機測試";
/* Class = "UILabel"; text = "8ms"; ObjectID = "lct-8a-Lqk"; */
"lct-8a-Lqk.text" = "8毫秒";
/* Class = "UITableViewController"; text = "Camera"; ObjectID = "lvC-jH-Oee"; */
"lvC-jH-Oee.title" = "相機";
/* Class = "UILabel"; text = "Resize Aspect Fill"; ObjectID = "mod-K3-RQU"; */
"mod-K3-RQU.text" = "按比例填充";
/* Class = "UILabel"; text = "HD 1920x1080"; ObjectID = "nbm-4k-ihb"; */
"nbm-4k-ihb.text" = "HD 1920x1080";
/* Class = "UILabel"; text = "30 fps"; ObjectID = "pKS-rd-Dx6"; */
"pKS-rd-Dx6.text" = "30 fps";
/* Class = "UILabel"; text = "Exposure Duration"; ObjectID = "soE-ah-Y4f"; */
"soE-ah-Y4f.text" = "曝光時間";
/* Class = "UILabel"; text = "30 fps"; ObjectID = "u82-lR-lTP"; */
"u82-lR-lTP.text" = "30 fps";
/* Class = "UILabel"; text = "100"; ObjectID = "y9H-1I-dYX"; */
"y9H-1I-dYX.text" = "100";
/* Class = "UILabel"; text = "ISO"; ObjectID = "yOn-QG-KiO"; */
"yOn-QG-KiO.text" = "ISO";

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.ai.panoptic.VitalSignObjCFramework</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

@ -0,0 +1,86 @@
---
triple: 'arm64-apple-darwin'
binary-path: '/Users/eddie/Library/Developer/Xcode/DerivedData/VitalSignEngine-fpcalwthewvozcfkzzhwpfgjeekq/Build/Intermediates.noindex/ArchiveIntermediates/VitalSignObjCFramework/InstallationBuildProductsLocation/Library/Frameworks/VitalSignObjCFramework.framework/VitalSignObjCFramework'
relocations:
- { offsetInCU: 0x33, offset: 0x33, size: 0x8, addend: 0x0, symName: _VitalSignObjCFrameworkVersionString, symObjAddr: 0x0, symBinAddr: 0x129D0, symSize: 0x0 }
- { offsetInCU: 0x67, offset: 0x67, size: 0x8, addend: 0x0, symName: _VitalSignObjCFrameworkVersionNumber, symObjAddr: 0x40, symBinAddr: 0x12A10, symSize: 0x0 }
- { offsetInCU: 0x183D9, offset: 0x18455, size: 0x8, addend: 0x0, symName: '-[SkinDetector initWithStrength:]', symObjAddr: 0x0, symBinAddr: 0x8000, symSize: 0xA8 }
- { offsetInCU: 0x18420, offset: 0x1849C, size: 0x8, addend: 0x0, symName: '-[SkinDetector reset]', symObjAddr: 0xA8, symBinAddr: 0x80A8, symSize: 0x8 }
- { offsetInCU: 0x18453, offset: 0x184CF, size: 0x8, addend: 0x0, symName: '-[SkinDetector thresholdComputed]', symObjAddr: 0xB0, symBinAddr: 0x80B0, symSize: 0x20 }
- { offsetInCU: 0x185D9, offset: 0x18655, size: 0x8, addend: 0x0, symName: '-[SkinDetector computeThreshold:fast:rough:]', symObjAddr: 0xD0, symBinAddr: 0x80D0, symSize: 0x12C }
- { offsetInCU: 0x19146, offset: 0x191C2, size: 0x8, addend: 0x0, symName: __ZN2cv3MatD1Ev, symObjAddr: 0x1FC, symBinAddr: 0x81FC, symSize: 0x94 }
- { offsetInCU: 0x191C8, offset: 0x19244, size: 0x8, addend: 0x0, symName: '-[SkinDetector getSkin:filtKernSize:error:]', symObjAddr: 0x290, symBinAddr: 0x8290, symSize: 0x2C8 }
- { offsetInCU: 0x1957E, offset: 0x195FA, size: 0x8, addend: 0x0, symName: '-[SkinDetector strength]', symObjAddr: 0x558, symBinAddr: 0x8558, symSize: 0x8 }
- { offsetInCU: 0x195B3, offset: 0x1962F, size: 0x8, addend: 0x0, symName: '-[SkinDetector setStrength:]', symObjAddr: 0x560, symBinAddr: 0x8560, symSize: 0x8 }
- { offsetInCU: 0x213E, offset: 0x1B8CC, size: 0x8, addend: 0x0, symName: __ZNSt3__119piecewise_constructE, symObjAddr: 0x6654, symBinAddr: 0x12A54, symSize: 0x0 }
- { offsetInCU: 0xD2BA, offset: 0x26A48, size: 0x8, addend: 0x0, symName: __ZNSt3__111__introsortINS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_Lb0EEEvT1_SA_T0_NS_15iterator_traitsISA_E15difference_typeEb, symObjAddr: 0x325C, symBinAddr: 0xB82C, symSize: 0x438 }
- { offsetInCU: 0xE5FE, offset: 0x27D8C, size: 0x8, addend: 0x0, symName: __ZNSt3__126__insertion_sort_unguardedB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_T0_, symObjAddr: 0x3918, symBinAddr: 0xBEE8, symSize: 0x218 }
- { offsetInCU: 0xF5DF, offset: 0x28D6D, size: 0x8, addend: 0x0, symName: __ZNSt3__111__sift_downB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_OT0_NS_15iterator_traitsISA_E15difference_typeESA_, symObjAddr: 0x55A0, symBinAddr: 0xDB70, symSize: 0x418 }
- { offsetInCU: 0x11158, offset: 0x2A8E6, size: 0x8, addend: 0x0, symName: __ZNSt3__117__floyd_sift_downB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EET1_SA_OT0_NS_15iterator_traitsISA_E15difference_typeE, symObjAddr: 0x5AC8, symBinAddr: 0xE098, symSize: 0x16C }
- { offsetInCU: 0x11925, offset: 0x2B0B3, size: 0x8, addend: 0x0, symName: __ZNSt3__131__partition_with_equals_on_leftB8ue170006INS_17_ClassicAlgPolicyEPNS_6vectorIdNS_9allocatorIdEEEERPFbS5_S5_EEET0_SA_SA_T1_, symObjAddr: 0x3F9C, symBinAddr: 0xC56C, symSize: 0x4E4 }
- { offsetInCU: 0x1433B, offset: 0x2DAC9, size: 0x8, addend: 0x0, symName: __ZNSt3__132__partition_with_equals_on_rightB8ue170006INS_17_ClassicAlgPolicyEPNS_6vectorIdNS_9allocatorIdEEEERPFbS5_S5_EEENS_4pairIT0_bEESB_SB_T1_, symObjAddr: 0x4480, symBinAddr: 0xCA50, symSize: 0x460 }
- { offsetInCU: 0x16724, offset: 0x2FEB2, size: 0x8, addend: 0x0, symName: __ZNSt3__127__insertion_sort_incompleteB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEbT1_SA_T0_, symObjAddr: 0x48E0, symBinAddr: 0xCEB0, symSize: 0x420 }
- { offsetInCU: 0x1B2C4, offset: 0x34A52, size: 0x8, addend: 0x0, symName: __ZNSt3__119__allocate_at_leastB8ue170006INS_9allocatorIdEEEENS_19__allocation_resultINS_16allocator_traitsIT_E7pointerEEERS5_m, symObjAddr: 0x2F70, symBinAddr: 0xB540, symSize: 0x34 }
- { offsetInCU: 0x1B356, offset: 0x34AE4, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS4_EE, symObjAddr: 0x2FA4, symBinAddr: 0xB574, symSize: 0x74 }
- { offsetInCU: 0x1B399, offset: 0x34B27, size: 0x8, addend: 0x0, symName: __ZNSt3__119__allocate_at_leastB8ue170006INS_9allocatorINS_6vectorIdNS1_IdEEEEEEEENS_19__allocation_resultINS_16allocator_traitsIT_E7pointerEEERS8_m, symObjAddr: 0x302C, symBinAddr: 0xB5FC, symSize: 0x44 }
- { offsetInCU: 0x1B441, offset: 0x34BCF, size: 0x8, addend: 0x0, symName: __ZNSt3__142__uninitialized_allocator_move_if_noexceptB8ue170006INS_9allocatorINS_6vectorIdNS1_IdEEEEEENS_16reverse_iteratorIPS4_EES8_S8_EET2_RT_T0_T1_S9_, symObjAddr: 0x3070, symBinAddr: 0xB640, symSize: 0xA8 }
- { offsetInCU: 0x1B8CB, offset: 0x35059, size: 0x8, addend: 0x0, symName: __ZNSt3__120__throw_length_errorB8ue170006EPKc, symObjAddr: 0x2A38, symBinAddr: 0xB008, symSize: 0x50 }
- { offsetInCU: 0x1B980, offset: 0x3510E, size: 0x8, addend: 0x0, symName: __ZNSt3__127__tree_balance_after_insertB8ue170006IPNS_16__tree_node_baseIPvEEEEvT_S5_, symObjAddr: 0x2D04, symBinAddr: 0xB2D4, symSize: 0x198 }
- { offsetInCU: 0x1BDA3, offset: 0x35531, size: 0x8, addend: 0x0, symName: __ZNSt3__142__uninitialized_allocator_move_if_noexceptB8ue170006INS_9allocatorINS_6vectorIdNS1_IdEEEEEENS_16reverse_iteratorIPS4_EES8_S8_EET2_RT_T0_T1_S9_, symObjAddr: 0x3070, symBinAddr: 0xB640, symSize: 0xA8 }
- { offsetInCU: 0x1C2CF, offset: 0x35A5D, size: 0x8, addend: 0x0, symName: __ZNSt3__17__sort3B8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEjT1_SA_SA_T0_, symObjAddr: 0x3B30, symBinAddr: 0xC100, symSize: 0x46C }
- { offsetInCU: 0x1E639, offset: 0x37DC7, size: 0x8, addend: 0x0, symName: __ZNSt3__17__sort4B8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_SA_SA_T0_, symObjAddr: 0x4D00, symBinAddr: 0xD2D0, symSize: 0x2C0 }
- { offsetInCU: 0x1FBB9, offset: 0x39347, size: 0x8, addend: 0x0, symName: __ZNSt3__17__sort5B8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_SA_SA_SA_T0_, symObjAddr: 0x4FC0, symBinAddr: 0xD590, symSize: 0x398 }
- { offsetInCU: 0x21854, offset: 0x3AFE2, size: 0x8, addend: 0x0, symName: __ZNSt3__116__insertion_sortB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_T0_, symObjAddr: 0x3694, symBinAddr: 0xBC64, symSize: 0x284 }
- { offsetInCU: 0x228B8, offset: 0x3C046, size: 0x8, addend: 0x0, symName: __ZNSt3__119__partial_sort_implB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_S9_EET1_SA_SA_T2_OT0_, symObjAddr: 0x53A8, symBinAddr: 0xD978, symSize: 0x1F8 }
- { offsetInCU: 0x23398, offset: 0x3CB26, size: 0x8, addend: 0x0, symName: __ZNSt3__110__pop_heapB8ue170006INS_17_ClassicAlgPolicyEPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_S9_RT0_NS_15iterator_traitsIS9_E15difference_typeE, symObjAddr: 0x59B8, symBinAddr: 0xDF88, symSize: 0x110 }
- { offsetInCU: 0x23927, offset: 0x3D0B5, size: 0x8, addend: 0x0, symName: __ZNSt3__19__sift_upB8ue170006INS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_EEvT1_SA_OT0_NS_15iterator_traitsISA_E15difference_typeE, symObjAddr: 0x5C34, symBinAddr: 0xE204, symSize: 0x220 }
- { offsetInCU: 0x25026, offset: 0x3E7B4, size: 0x8, addend: 0x0, symName: __ZSt28__throw_bad_array_new_lengthB8ue170006v, symObjAddr: 0x2AAC, symBinAddr: 0xB07C, symSize: 0x28 }
- { offsetInCU: 0x2757E, offset: 0x40D0C, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS4_EE, symObjAddr: 0x2FA4, symBinAddr: 0xB574, symSize: 0x74 }
- { offsetInCU: 0x297A3, offset: 0x42F31, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC2Ed, symObjAddr: 0x0, symBinAddr: 0x8670, symSize: 0x18 }
- { offsetInCU: 0x297CF, offset: 0x42F5D, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC2Ed, symObjAddr: 0x0, symBinAddr: 0x8670, symSize: 0x18 }
- { offsetInCU: 0x297EE, offset: 0x42F7C, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC2Ed, symObjAddr: 0x0, symBinAddr: 0x8670, symSize: 0x18 }
- { offsetInCU: 0x2983B, offset: 0x42FC9, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC1Ed, symObjAddr: 0x18, symBinAddr: 0x8688, symSize: 0x18 }
- { offsetInCU: 0x29877, offset: 0x43005, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC1Ed, symObjAddr: 0x18, symBinAddr: 0x8688, symSize: 0x18 }
- { offsetInCU: 0x2989D, offset: 0x4302B, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC1Ed, symObjAddr: 0x18, symBinAddr: 0x8688, symSize: 0x18 }
- { offsetInCU: 0x298BC, offset: 0x4304A, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetectorC1Ed, symObjAddr: 0x18, symBinAddr: 0x8688, symSize: 0x18 }
- { offsetInCU: 0x2B595, offset: 0x44D23, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetector17compute_thresholdERN2cv3MatEbb, symObjAddr: 0x30, symBinAddr: 0x86A0, symSize: 0x2464 }
- { offsetInCU: 0x3528D, offset: 0x4EA1B, size: 0x8, addend: 0x0, symName: __ZNSt3__16__treeINS_12__value_typeIidEENS_19__map_value_compareIiS2_NS_4lessIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJRKiEEENSE_IJEEEEEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEElEEbEERKT_DpOT0_, symObjAddr: 0x2BF0, symBinAddr: 0xB1C0, symSize: 0xC0 }
- { offsetInCU: 0x355DF, offset: 0x4ED6D, size: 0x8, addend: 0x0, symName: __ZNSt3__16__treeINS_12__value_typeIidEENS_19__map_value_compareIiS2_NS_4lessIiEELb1EEENS_9allocatorIS2_EEE25__emplace_unique_key_argsIiJRKNS_21piecewise_construct_tENS_5tupleIJOiEEENSE_IJEEEEEENS_4pairINS_15__tree_iteratorIS2_PNS_11__tree_nodeIS2_PvEElEEbEERKT_DpOT0_, symObjAddr: 0x2E9C, symBinAddr: 0xB46C, symSize: 0xC0 }
- { offsetInCU: 0x35931, offset: 0x4F0BF, size: 0x8, addend: 0x0, symName: __ZL13vector_extendIdEvRNSt3__16vectorIT_NS0_9allocatorIS2_EEEES6_, symObjAddr: 0x2AD4, symBinAddr: 0xB0A4, symSize: 0x100 }
- { offsetInCU: 0x35DBC, offset: 0x4F54A, size: 0x8, addend: 0x0, symName: __ZL13compare_tupleNSt3__16vectorIdNS_9allocatorIdEEEES3_, symObjAddr: 0x2BD4, symBinAddr: 0xB1A4, symSize: 0x1C }
- { offsetInCU: 0x35DD9, offset: 0x4F567, size: 0x8, addend: 0x0, symName: __ZNSt3__114__split_bufferINS_6vectorIdNS_9allocatorIdEEEERNS2_IS4_EEED2Ev, symObjAddr: 0x3190, symBinAddr: 0xB760, symSize: 0x34 }
- { offsetInCU: 0x35EF5, offset: 0x4F683, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorIdNS_9allocatorIdEEE16__init_with_sizeB8ue170006IPdS5_EEvT_T0_m, symObjAddr: 0x5E54, symBinAddr: 0xE424, symSize: 0x78 }
- { offsetInCU: 0x3635B, offset: 0x4FAE9, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE16__destroy_vectorclB8ue170006Ev, symObjAddr: 0x5ECC, symBinAddr: 0xE49C, symSize: 0x40 }
- { offsetInCU: 0x36449, offset: 0x4FBD7, size: 0x8, addend: 0x0, symName: __ZNSt3__16__treeINS_12__value_typeIidEENS_19__map_value_compareIiS2_NS_4lessIiEELb1EEENS_9allocatorIS2_EEE7destroyEPNS_11__tree_nodeIS2_PvEE, symObjAddr: 0x5F60, symBinAddr: 0xE530, symSize: 0x40 }
- { offsetInCU: 0x36594, offset: 0x4FD22, size: 0x8, addend: 0x0, symName: __ZNKSt3__16vectorIdNS_9allocatorIdEEE20__throw_length_errorB8ue170006Ev, symObjAddr: 0x2F5C, symBinAddr: 0xB52C, symSize: 0x14 }
- { offsetInCU: 0x365BE, offset: 0x4FD4C, size: 0x8, addend: 0x0, symName: __ZNSt3__119__allocate_at_leastB8ue170006INS_9allocatorIdEEEENS_19__allocation_resultINS_16allocator_traitsIT_E7pointerEEERS5_m, symObjAddr: 0x2F70, symBinAddr: 0xB540, symSize: 0x34 }
- { offsetInCU: 0x365C9, offset: 0x4FD57, size: 0x8, addend: 0x0, symName: __ZNKSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE20__throw_length_errorB8ue170006Ev, symObjAddr: 0x3018, symBinAddr: 0xB5E8, symSize: 0x14 }
- { offsetInCU: 0x365F3, offset: 0x4FD81, size: 0x8, addend: 0x0, symName: __ZNSt3__119__allocate_at_leastB8ue170006INS_9allocatorINS_6vectorIdNS1_IdEEEEEEEENS_19__allocation_resultINS_16allocator_traitsIT_E7pointerEEERS8_m, symObjAddr: 0x302C, symBinAddr: 0xB5FC, symSize: 0x44 }
- { offsetInCU: 0x365FE, offset: 0x4FD8C, size: 0x8, addend: 0x0, symName: __ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B8ue170006ILi0EEEPKc, symObjAddr: 0x2984, symBinAddr: 0xAF54, symSize: 0xA0 }
- { offsetInCU: 0x3699E, offset: 0x5012C, size: 0x8, addend: 0x0, symName: __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE20__throw_length_errorB8ue170006Ev, symObjAddr: 0x2A24, symBinAddr: 0xAFF4, symSize: 0x14 }
- { offsetInCU: 0x36A66, offset: 0x501F4, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetector8get_skinERN2cv3MatEdS3_, symObjAddr: 0x2528, symBinAddr: 0xAB04, symSize: 0x430 }
- { offsetInCU: 0x3770C, offset: 0x50E9A, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetector5resetEv, symObjAddr: 0x2958, symBinAddr: 0xAF34, symSize: 0x8 }
- { offsetInCU: 0x37734, offset: 0x50EC2, size: 0x8, addend: 0x0, symName: __ZN8panoptic12SkinDetector18threshold_computedEv, symObjAddr: 0x2960, symBinAddr: 0xAF3C, symSize: 0x18 }
- { offsetInCU: 0x37942, offset: 0x510D0, size: 0x8, addend: 0x0, symName: __ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE20__throw_length_errorB8ue170006Ev, symObjAddr: 0x2A24, symBinAddr: 0xAFF4, symSize: 0x14 }
- { offsetInCU: 0x3796C, offset: 0x510FA, size: 0x8, addend: 0x0, symName: __ZNSt3__120__throw_length_errorB8ue170006EPKc, symObjAddr: 0x2A38, symBinAddr: 0xB008, symSize: 0x50 }
- { offsetInCU: 0x37977, offset: 0x51105, size: 0x8, addend: 0x0, symName: __ZNSt12length_errorC1B8ue170006EPKc, symObjAddr: 0x2A88, symBinAddr: 0xB058, symSize: 0x24 }
- { offsetInCU: 0x37A03, offset: 0x51191, size: 0x8, addend: 0x0, symName: __ZL13compare_tupleNSt3__16vectorIdNS_9allocatorIdEEEES3_, symObjAddr: 0x2BD4, symBinAddr: 0xB1A4, symSize: 0x1C }
- { offsetInCU: 0x37A43, offset: 0x511D1, size: 0x8, addend: 0x0, symName: __ZL13compare_tupleNSt3__16vectorIdNS_9allocatorIdEEEES3_, symObjAddr: 0x2BD4, symBinAddr: 0xB1A4, symSize: 0x1C }
- { offsetInCU: 0x37D43, offset: 0x514D1, size: 0x8, addend: 0x0, symName: __ZNSt3__16__treeINS_12__value_typeIidEENS_19__map_value_compareIiS2_NS_4lessIiEELb1EEENS_9allocatorIS2_EEE16__insert_node_atEPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSE_SE_, symObjAddr: 0x2CB0, symBinAddr: 0xB280, symSize: 0x54 }
- { offsetInCU: 0x38092, offset: 0x51820, size: 0x8, addend: 0x0, symName: __ZNSt3__128__exception_guard_exceptionsINS_29_AllocatorDestroyRangeReverseINS_9allocatorINS_6vectorIdNS2_IdEEEEEENS_16reverse_iteratorIPS5_EEEEED2B8ue170006Ev, symObjAddr: 0x3118, symBinAddr: 0xB6E8, symSize: 0x34 }
- { offsetInCU: 0x380D3, offset: 0x51861, size: 0x8, addend: 0x0, symName: __ZNKSt3__129_AllocatorDestroyRangeReverseINS_9allocatorINS_6vectorIdNS1_IdEEEEEENS_16reverse_iteratorIPS4_EEEclB8ue170006Ev, symObjAddr: 0x314C, symBinAddr: 0xB71C, symSize: 0x44 }
- { offsetInCU: 0x383CF, offset: 0x51B5D, size: 0x8, addend: 0x0, symName: __ZNSt3__114__split_bufferINS_6vectorIdNS_9allocatorIdEEEERNS2_IS4_EEE17__destruct_at_endB8ue170006EPS4_, symObjAddr: 0x31C4, symBinAddr: 0xB794, symSize: 0x58 }
- { offsetInCU: 0x385EB, offset: 0x51D79, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorIdNS_9allocatorIdEEE11__vallocateB8ue170006Em, symObjAddr: 0x321C, symBinAddr: 0xB7EC, symSize: 0x40 }
- { offsetInCU: 0x38659, offset: 0x51DE7, size: 0x8, addend: 0x0, symName: __ZNSt3__111__introsortINS_17_ClassicAlgPolicyERPFbNS_6vectorIdNS_9allocatorIdEEEES5_EPS5_Lb0EEEvT1_SA_T0_NS_15iterator_traitsISA_E15difference_typeEb, symObjAddr: 0x325C, symBinAddr: 0xB82C, symSize: 0x438 }
- { offsetInCU: 0x38766, offset: 0x51EF4, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorIdNS_9allocatorIdEEE13__move_assignERS3_NS_17integral_constantIbLb1EEE, symObjAddr: 0x5358, symBinAddr: 0xD928, symSize: 0x50 }
- { offsetInCU: 0x38A71, offset: 0x521FF, size: 0x8, addend: 0x0, symName: __ZNSt3__16vectorINS0_IdNS_9allocatorIdEEEENS1_IS3_EEE7__clearB8ue170006Ev, symObjAddr: 0x5F0C, symBinAddr: 0xE4DC, symSize: 0x54 }
- { offsetInCU: 0x8C4F, offset: 0x5B144, size: 0x8, addend: 0x0, symName: __Z11quickselectPdii, symObjAddr: 0x0, symBinAddr: 0xE66C, symSize: 0x7C }
- { offsetInCU: 0x8CF9, offset: 0x5B1EE, size: 0x8, addend: 0x0, symName: __Z9partitionPdii, symObjAddr: 0x7C, symBinAddr: 0xE6E8, symSize: 0x60 }
- { offsetInCU: 0x8DF5, offset: 0x5B2EA, size: 0x8, addend: 0x0, symName: __Z4swapPdS_, symObjAddr: 0xDC, symBinAddr: 0xE748, symSize: 0x14 }
- { offsetInCU: 0x910A, offset: 0x5B5FF, size: 0x8, addend: 0x0, symName: '+[CVHelper crop:withRect:]', symObjAddr: 0xF0, symBinAddr: 0xE75C, symSize: 0x2CC }
- { offsetInCU: 0x9B19, offset: 0x5C00E, size: 0x8, addend: 0x0, symName: '+[CVHelper rgbMean:]', symObjAddr: 0x450, symBinAddr: 0xEA28, symSize: 0xA5C }
- { offsetInCU: 0xAF51, offset: 0x5D446, size: 0x8, addend: 0x0, symName: '+[CVHelper brightness:]', symObjAddr: 0xEAC, symBinAddr: 0xF484, symSize: 0xAC0 }
- { offsetInCU: 0xC21E, offset: 0x5E713, size: 0x8, addend: 0x0, symName: '+[CVHelper resizeToRgbUsing:of:]', symObjAddr: 0x196C, symBinAddr: 0xFF44, symSize: 0xC58 }
- { offsetInCU: 0xD852, offset: 0x5FD47, size: 0x8, addend: 0x0, symName: '+[CVHelper resizeToYuvUsing:of:]', symObjAddr: 0x25C4, symBinAddr: 0x10B9C, symSize: 0xBD8 }
- { offsetInCU: 0xEEF0, offset: 0x613E5, size: 0x8, addend: 0x0, symName: '+[CVHelper resizeToRgbFloatUsing:of:]', symObjAddr: 0x319C, symBinAddr: 0x11774, symSize: 0xC58 }
...

@ -0,0 +1,17 @@
//
// VitalSignObjCFramework.h
// VitalSignObjCFramework
//
// Created by Eddie Lau on 8/6/2023.
//
#import <Foundation/Foundation.h>
//! Project version number for VitalSignObjCFramework.
FOUNDATION_EXPORT double VitalSignObjCFrameworkVersionNumber;
//! Project version string for VitalSignObjCFramework.
FOUNDATION_EXPORT const unsigned char VitalSignObjCFrameworkVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <VitalSignObjCFramework/PublicHeader.h>

@ -0,0 +1,38 @@
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint vital_sign_camera.podspec` to validate before publishing.
#
Pod::Spec.new do |s|
s.name = 'vital_sign_camera'
s.version = '0.0.1'
s.summary = 'A new Flutter plugin project.'
s.description = <<-DESC
A new Flutter plugin project.
DESC
s.homepage = 'http://example.com'
s.license = { :file => '../LICENSE' }
s.author = { 'Your Company' => 'email@example.com' }
s.source = { :path => '.' }
s.source_files = 'Classes/**/*'
s.dependency 'Flutter'
s.platform = :ios, '9.0'
# Flutter.framework does not contain a i386 slice.
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
s.swift_version = '5.0'
s.ios.deployment_target = '12.0'
s.dependency 'OpenCV-Dynamic-Framework', '4.3.0.1'
s.dependency 'PromiseKit', '~> 8'
s.dependency "GoogleMLKit/FaceDetection"
s.dependency 'ZIPFoundation', '~> 0.9'
if ENV['LOCAL_CORE_DEVELOPMENT'] == '1' then
s.pod_target_xcconfig = {
"SWIFT_INCLUDE_PATHS" => '"${PODS_CONFIGURATION_BUILD_DIR}/VitalSignEngineCore"'
}
else
s.vendored_frameworks = ['frameworks/VitalSignEngineCore.xcframework','frameworks/VitalSignObjCFramework.xcframework']
end
end

@ -0,0 +1,19 @@
/// Represents the pixel format of a `Frame`.
/// * `v420`: 420 YpCbCr 8 Bi-Planar Video Range
/// * `f420`: 420 YpCbCr 8 Bi-Planar Full Range
/// * `x420`: 420 YpCbCr 10 Bi-Planar Video Range
enum PixelFormat { f420, v420, x420 }
PixelFormat pixelFormatFromString(String string) {
switch (string) {
case '420f':
return PixelFormat.f420;
case '420v':
return PixelFormat.v420;
case 'x420':
return PixelFormat.x420;
default:
// ignore: fixme
return PixelFormat.f420;
}
}

@ -0,0 +1,138 @@
/// The vital signs result of a scan.
class VitalSign {
final double heartRate;
final double spo2;
final double ibi;
final double? stress;
final double? stressScore;
final double? respiratoryRate;
final double? hrvSdnn;
final double? hrvRmssd;
final double? temperature;
final String? bloodPressure;
final double? bloodPressureSystolic;
final double? bloodPressureDiastolic;
final double? facialSkinAge;
final double? bloodAlcohol;
final double? bloodSugar;
final String? version;
const VitalSign(
this.heartRate,
this.spo2,
this.ibi,
this.stress,
this.stressScore,
this.respiratoryRate,
this.hrvSdnn,
this.hrvRmssd,
this.temperature,
this.bloodPressure,
this.bloodPressureSystolic,
this.bloodPressureDiastolic,
this.facialSkinAge,
this.bloodAlcohol,
this.bloodSugar,
this.version);
factory VitalSign.fromMap(Map map) {
return VitalSign(
map['heartRate'],
map['spo2'],
map['ibi'],
map['stress'],
map['stressScore'],
map['respiratoryRate'],
map['hrvSdnn'],
map['hrvRmssd'],
map['temperature'],
map['bloodPressure'],
map['bloodPressureSystolic'],
map['bloodPressureDiastolic'],
map['facialSkinAge'],
map['bloodAlcohol'],
map['bloodSugar'],
map['version']);
}
}
/// The cardiovascular risks result of a scan.
class CardiovascularRisks {
final double generalRisk;
final double coronaryHeartDisease;
final double congestiveHeartFailure;
final double intermittentClaudication;
final double stroke;
const CardiovascularRisks(this.generalRisk, this.coronaryHeartDisease,
this.congestiveHeartFailure, this.intermittentClaudication, this.stroke);
factory CardiovascularRisks.fromMap(Map map) {
return CardiovascularRisks(
map['generalRisk'],
map['coronaryHeartDisease'],
map['congestiveHeartFailure'],
map['intermittentClaudication'],
map['stroke']);
}
}
/// The covid risk result of a scan.
class CovidRisk {
final double covidRisk;
const CovidRisk(this.covidRisk);
factory CovidRisk.fromMap(Map map) {
return CovidRisk(map['covidRisk']);
}
}
/// The health risks result of a scan.
class HealthRisks {
final CardiovascularRisks? cardiovascularRisks;
final CovidRisk? covidRisk;
final String version;
const HealthRisks(this.cardiovascularRisks, this.covidRisk, this.version);
factory HealthRisks.fromMap(Map map) {
return HealthRisks(
map['cardiovascularRisks'] != null
? CardiovascularRisks.fromMap(map['cardiovascularRisks'])
: null,
map['covidRisk'] != null ? CovidRisk.fromMap(map['covidRisk']) : null,
map['version']);
}
}
/// The holistic analysis result of a scan.
class HolisticAnalysis {
final double? generalWellness;
final double? bmi;
final double? absi;
final double? cardiacWorkload;
final double? pulseRespiratoryQuotient;
final double? waistToHeightRatio;
final String? version;
const HolisticAnalysis(
this.generalWellness,
this.bmi,
this.absi,
this.cardiacWorkload,
this.pulseRespiratoryQuotient,
this.waistToHeightRatio,
this.version);
factory HolisticAnalysis.fromMap(Map map) {
return HolisticAnalysis(
map['generalWellness'],
map['bmi'],
map['absi'],
map['cardiacWorkload'],
map['pulseRespiratoryQuotient'],
map['waistToHeightRatio'],
map['version']);
}
}

@ -0,0 +1,42 @@
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import 'camera_permission.dart';
import 'camera_device.dart';
import 'vital_sign_camera_method_channel.dart';
abstract class VitalSignCameraPlatform extends PlatformInterface {
/// Constructs a VitalSignCameraPlatform.
VitalSignCameraPlatform() : super(token: _token);
static final Object _token = Object();
static VitalSignCameraPlatform _instance = MethodChannelVitalSignCamera();
/// The default instance of [VitalSignCameraPlatform] to use.
///
/// Defaults to [MethodChannelVitalSignCamera].
static VitalSignCameraPlatform get instance => _instance;
/// Platform-specific implementations should set this with their own
/// platform-specific class that extends [VitalSignCameraPlatform] when
/// they register themselves.
static set instance(VitalSignCameraPlatform instance) {
PlatformInterface.verifyToken(instance, _token);
_instance = instance;
}
Future<List<CameraDevice>> availableCameraDevices() {
throw UnimplementedError(
'availableCameraDevices() has not been implemented.');
}
Future<CameraPermissionStatus> requestCameraPermission() {
throw UnimplementedError(
'availableCameraDevices() has not been implemented.');
}
Future<CameraPermissionStatus> getCameraPermissionStatus() {
throw UnimplementedError(
'getCameraPermissionStatus() has not been implemented.');
}
}

@ -1,6 +1,6 @@
name: vital_sign_camera
description: The Flutter Plugin for the Vital Sign Camera by PanopticAI.
version: 1.6.1
version: 1.6.2
homepage:
environment:

Loading…
Cancel
Save